本文根据B站pink老师的视频整理
由于有其他语言(C、JAVA)的基础,有些相同的内容就没有做笔记
如果你之前学过JAVA、C,那么这篇文章会比较适合你过一遍JS的基础
本文内容:
1. JS是什么
2. JS的作用
3. 浏览器如何执行JS
4. JS的三部分组成
4.1 ECMAScript
4.2 DOM文档对象类型
4.3 BOM浏览器对象模型
5. JS的书写位置
6. JS输入输出语句
7. 变量
7.1 变量的声明
7.2 变量的语法扩展
7.2.1 更新变量
7.2.2 同时声明多个变量
7.2.3 声明变量特殊情况
7.3 变量命名规范
8. 数据类型
8.1 为什么需要数据类型
8.2 变量的数据类型
8.3 数据类型的分类
8.4 简单数据类型
8.4.1 数字型
数字型范围
数字型的三个特殊值
isNaN()方法
8.4.2 字符串型
字符串引号嵌套
字符串转义
字符串长度
字符串拼接
8.4.3 Boolean类型
8.4.4 undefined、null
8.5 获取变量数据类型
8.6 数据类型转换
8.6.1 转换为字符型
8.6.2 转换为数字型
8.6.3 转换为布尔型
9. 运算符优先级
10. 函数参数
10.1 形参与实参的匹配问题
10.2 arguments的使用
11. 函数的两种声明方式
12. JS作用域
13. 作用域链
14. 预解析
15. 预解析案例
16. 对象
16.1 创建对象的三种方式
16.2 new关键字执行过程
16.3 遍历对象
浏览器分为两部分:渲染引擎
和JS引擎
注意:浏览器本身并不会执行JS代码,而是通过内置JS引擎(解释器)来执行JS代码,JS引擎执行代码时,会逐行解释每一句源码(转换为机器语言),然后由计算机去执行,所以JavaScript语言归为脚本语言,会逐行解释执行。
ECMAScript是由ECMA国际(原欧洲计算机制造商协会)进行标准化的一门编程语言,这种语言在万维网上应用广泛,它往往被称为 Javascript 或 JScript ,但实际上后两者是 ECMAScript 语言的实现和扩展
ECMAScript 规定了JS的编程语法和核心基础知识,是所有浏览器厂商共同遵循的一套JS语法工业标准
文档对象模型( Document ObjectModel ,简称DOM) ,是W3C组织推荐的处理可扩展标记语言的标准编程接口。通过DOM提供的接口可以对页面上的各种元素进行操作( 大小、位置、颜色等 )
BOM ( Browser Object Model ,简称BOM ) 是指浏览器对象模型,它提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。通过BOM可以操作浏览器窗口,比如弹出框、控制浏览器跳转、获取分辨率等
直接写到元素的内部。
例如:
<body>
<input type="button" value="hello" onclick="alert('你好呀!')">
body>
当点击hello按钮时,网页会弹出 “你好呀” 的窗口。
注意:
onclick
把JS代码放到
打印的是10还是20? 答案是20
如果函数中还有函数,那么在这个作用域种就又会诞生一个作用域
根据在内部函数可以访问外部函数变量的机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链。
可以理解为一种就近原则。
首先来看几个问题,看他们的结果会是怎样:
结果会报错,因为num既没有定义也没有赋值;
结果还是报错吗?不,结果变成了undifined
结果是多少?会报错吧应该,因为函数调用放到了最前面呀
错!结果会正常输出123
会正常输出123 ? 错!
结果会报错:fn is not a function
看了上面的几个问题,下面正式来学习下预解析。
实际上,JS 引擎执行 JS 代码分为两步:预解析
和代码执行
首先,JS 引擎会把 JS 里面所有的 var
还有 function
提升到当前作用域
的最前面,然后再执行代码,即一行一行地运行代码。
预解析又分为变量预解析(变量提升)
和函数预解析(函数提升)
变量预解析
:把所有的变量声明提升到当前作用域的最前面,不提升赋值操作。
这就能很好的解释:
/*
为什么结果会是undefined?
实际上,首先进行了预解析,进行了变量提升,相当于执行了如下代码:
*/
var num;
console.log(num);
num = 10;
/* 变量只定义不赋值结果当然就是undefined了 */
/* 实际上相当于执行了以下代码: */
var fn; //提到最前面
fn();
fn = function (){
console.log(123);
}
/* 这样的代码结果当然会报错啦 */
同样的道理,再来看看函数预解析
:就是把函数声明提升到当前作用域的最前面,不调用函数。
这就可以解释:
/* 为什么能够正常执行?
实际上是执行了以下代码:*/
/* 所以不管 fn() 在前面还是后面都不影响 */
案例一:
var num = 10;
fn();
function fn() {
console.log(num);
var num = 20;
}
答案是undifined
进行预解析后相当于:
var num;
function fn() {
var num;
console.log(num);
num = 20;
}
num = 10;
fn();
结果就是undefined
案例二:
var num = 10;
function fn() {
console.log(num);
var num = 20;
console.log(num);
}
fn();
结果是undefined 20
相当于执行了以下代码:
var num;
function fn() {
var num;
console.log(num);
num = 20;
console.log(num);
}
num = 10;
fn();
案例三:
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
}
结果是undefined 9
相当于执行了:
var a;
funtion f1() {
var b;
var a;
b = 9;
console.log(a);
console.log(b);
a = '123';
}
a = 18;
f1();
案例四:
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
结果是9 9 9 9 9 a is not defined
相当于执行了以下代码:
function f1() {
var a;
a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
/*
因为 var a = b = c = 9;
相当于是
var a = 9;
b = 9;
c = 9; 此时的 b , c 应该是全局变量
集体声明应该是:var a = 9,b = 9,c = 9;
*/
1、利用对象字面量创建对象
var obj = {}; //创建了一个空的对象
var person = {
name: '张三';
age: 18;
sex: '男';
sayHi: function(){
console.log('hi');
}
}
注意:
属性和方法采用键值对
的形式
多个属性和方法中间用逗号隔开
方法冒号后面跟的是一个匿名函数
调用对象的属性,有两种方法
方法一: 对象名.属性名
方法二:对象名['属性名']
对象名.方法名()
2、利用new Object()
创建对象
var person = new Object();
person.name = '张三';
person.age = 18;
person.sayHi = function(){
console.log('hi');
}
注意:
分号;
隔开3、利用构造函数创建对象
有木有注意到,前面两种方法一次只能创建一个对象,如果里面的很多方法属性是相同的,那么一次又一次创建岂不是很麻烦 ?
因此,可以利用函数来重复这些相同的代码,这个函数就是构造函数,它里面封装的不是普通代码,而是对象。
所以,构造函数就是把对象里面相同的属性和方法抽象出来封装到函数里面。
创建语法:
function Person(name, age) {
this.name = name;
this.age = age;
this.say = function (str) {
console.log(str);
}
}
var zhangSan = new Person('张三', 18);
console.log(zhangSan.age);
zhangSan.say('hello');
注意:
大写
object
new
,就相当于创建了一个新的对象new
关键字执行过程this
指向这个空对象return
)通过fon in
来便利对象中的属性
var obj = {
name: 'xiaoming',
age: 18
}
for (var k in obj) {
console.log(k); //输出的是属性名
console.log(obj[k]); //输出的是值
}