语言基础
语法
标识符
-
标识符,就是变量、函数名、函数参数、属性的名称。具体规则可以去看红宝书,这里只介绍什么是标识符。
-
代码加分号可以提高性能,否则浏览器还要去判断一下,这一行代码要不要加分号。
-
标识符使用驼峰命名法
变量
var
和 let
的注意事项和区别
-
未初始化的变量,会默认放一个值为
undefined
存起来。未初始化,现在我这里理解成就是未赋初值的变量。var msg; // undefined
-
没有声明的变量会报错。所以声明和初始化,一个会报错,一个不会报错。
-
在函数内部不使用
var
或者let
声明的变量,会是一个全局变量,函数执行完后,该变量不会被销毁。但是一般不建议这么做,因为不利于维护。function fun(){ var msg = 'hello world' } fun(); console.log(msg) // 出错 function fun(){ msg = 'hello world' } fun(); console.log(msg) // 'hello world'
-
let
和var
区别-
let
声明的范围是块作用域,就是声明的变量的范围在一个代码块中。代码块用{}
表示,比如if
中声明的变量只能在这块代码中有效。 -
let
声明的变量不会被变量提升。这里会引申一个知识点叫暂时性死区
暂时性死区: 在
let
声明变量之前,代码执行的瞬间称为暂时性死区,在此阶段引用任何后面声明的变量,都会抛出错误:ReferenceError
,简而言之,就是引用未被声明的变量,会出现暂时性死区。-
与
var
关键字不同,使用let
声明的变量不会被挂载到window
上.var msg = 'hello world'; console.log(window.msg) // 'hello world' let msg = 'hello world'; console.log(window.msg) // undefined
-
在
for
循环中的let
和var
for (var i = 0; i < 5; i++) { setTimeout(() => { console.log(i) }, 1000); } // 5 5 5 5 5
for (let i = 0; i < 5; i++) { setTimeout(() => { console.log(i) }, 1000); } // 0 1 2 3 4
var
: 所有的i
都是同一个变量。所以最后打印的是同一个let
:每次都会重新声明一个新的i
。所以每一个i
都对应有一个console
let
声明的变量不能被重新定义,而var可以被重新定义。
-
数据类型
基础数据类型+复杂数据类型
基础数据类型有6种:Null,Undefined,Number,String,Boolean,Symbel
复杂数据类型:Object
,以上6种数据类型不足以区分具体的数据类型,所以typeof
就来了。可以区分对象和函数,
-
Undefined
类型只有一个值:undefined
,就是未赋初始值时,存的值就是undefined
,(注意不是字符串'undefined')typeof undefined // 'undefined' typeof null // 'object' typeof 函数 // 'function'
能让
typeof undefined === 'undefined'
有两种情况: 未声明的变量和未赋初始值的变量。用typeof
检测会返回'undefined'
let msg console.log(typeof msg) // 'undefined' console.log(typeof a) // 'undefined'
-
null == undefined
-
如果一个变量将来需要存对象但是目前又不知道存谁,则可以给这个变量先赋初始值
null
,因为null
表示的是一个空对象。 -
Number()
类型NaN
:不是数值,用于表示本来要返回的数据是数字,返回失败了,没有报错,就返回了NaN
.- isNaN(value):判断一个数是否是NaN,会首先将value转换为数值,转换失败了的就会返回true。在项目中的应用场景可以应用于,将value转换为数值,用isNaN(value)来判断是否转换异常。
- isNaN()确实也适用于对象。在基于对象调用 isNaN() 函数时,会首先调用对象的 valueOf()方法,然后确定该方法返回的值是否可以转 换为数值。如果不能,则基于这个返回值再调用 toString()方法,再测试返回值。 而这个过程也是 ECMAScript 中内置函数和操作符的一般执行流程,更详细的内容请 参见 3.5 节。
var obj = {0: 1} obj.valueOF() // {0: 1} Number({0: 1}) // NaN obj.valueOf().toString() // "[object object]" Number("[object object]") // NaN // 所以 isNaN({0: 1}) // true
-
String
类型
- 任何数据类型都有
toString()
方法,转换为字符串,但是null
和undefined
没有,要想要null
和undefined
也可以转换为对应的字符串格式,可以用String(null/undefined)=> "null" /"undefined"
- 要把某个值转换为字符串,可以使用加号操作符,把它与一个字符 串("")加在一起。
Object
类型
-
Object 的每个实例都具有下列属性和方法。
var obj = new Object()
constructor
:obj.constructor => Object()
,表示obj这个对象是由哪个函数创造出来的,constructor英文就是构造者的意思。hasOwnProperty()
:obj.hasOwnProperty('name')
:判断某个属性是否在这个对象自身属性上。如这个'name'属性是否在obj对象的自身属性上。isPrototypeOf(object)
:目前不清楚。propertyIsEnumerable(属性名)
:用于检查给定的属性是否能够使用for-in
语句来枚举.toLocaleString()
:返回对象的字符串表示toString()
:返回对象的字符串表示。这两个啥区别?valueOf()
:返回对象的字符串、数值或布尔值表示
关系运算符
-
对象与其他类型数据(不是对象)比较大小,会先运用对象的
valueOf()
方法,转换为基础数据类型,再去比较。在这里可以改写对象的
valueOf
方法,修改返回值。var obj1 = { a: 1, valueOf() { return 3 } } var a = 3 console.log(obj1 == a) // true console.log(obj1 === a) // false