犀牛书笔记(前3章)

犀牛书笔记(前3章)

JavaScript会把换行符当做插入一个分号,但如果上下两行连起来是有意义的语句,则会当做连起来解释。但是该规则有3个例外:1)return,break, continue等流程控制语句 return后面如果有换行符,第二行是return的内容,则javascript引擎会认为你return了一个空,而非第二行的内容。 2)自增、自减的运算符,a++, 如果++放在第二行,不会按照作者的意志执行。3)箭头函数,λ表达式的箭头必须与参数列表在同一行。

js中的null和undefined都是primitive value,即存放在栈中的值。但是typeof null是object.

null和undefined的理解:undefined是一个预定义的全局常量,而null是语言关键字。(不重要。。。写代码不需要理解这个)。 null == undefined 是true, null === undefined是false。

js的string类型是不可变值。

==和===的区别,===不做自动类型转换。

js中,向上溢出(overflow),向下溢出(underflow),和除零,是不会引起错误的。overflow/除0时返回Infinity/-Infinity, underflow时返回0。

关于除0的诡异之处 0/0返回NaN,非0/0返回Infinity

NaN跟任何值都不相等,包括它自己。判断一个数是否NaN的时候,可以用x != x, 或者Number.isNaN(),或者全局函数 isNaN()。

Number.isFinite(): 非Infinity, -Infinity, NaN的时候返回true.

BigInt, Es2020引入,用于表示64位整数。字面量用n结尾,默认十进制,加0b, 0o,0x表示二进制、8进制、16进制。但是不建议把BigInt跟普通数字混合使用,因为BigInt范围大,却只能表示整数,说明BigInt的表达范围与普通浮点数的表达范围是交叉的关系,无法确定运算结果用什么类型表示,怎么表示。

js里的string类型表示的是UTF-16字符(无符号)的序列。字符可以有一个码点(16位),也可以有2个码点(32位)。但是在ES6之后,使用for…of遍历字符串的时候,单位是字符而非码点。

字符串换行的几种方式:

    str.charCodeAt(): 码点

    str.codePointAt(): 字符

    str不可变,toUpperCase, replace这样的方法,只是返回了一个新的字符串。

    ES6引入了symbol. 用于作为对象的非字符串key值。symbol没有字面量表示,创建的时候需要用Symbol()构造函数。

    Symbol()构造函数创造的实例都是不同的,但是Symbol.for()“工厂方法”对相同参数,返回的是同一实例。

    全局对象:Node中的global, 和浏览器里的window。ES2020定义了globalThis对象来统一二者。

    JavaScript类型转换表

    一些手动类型转换的方言:

    x + “” // => String(x)

    +x // => Number(x)

    x-0 // => Number(x)

    !!x // => Boolean(x): Note double !

    Js的对象变量(object)向primitive value的转换:3种策略。prefer-string: 优先转成字符串;prefer-number: 优先转成数字;no-prefer: 没有倾向。js的内置类型中,Date变量采用优先string, 其他的都是优先数字。

    对象转成boolean: 所有都是true. 包括空字符、new Boolean(false).

    对象转成string: 1. 使用prefer-string算法转成primitive value; 2. 将该primitive value转成字符串。

    对象转成数字:1. 使用prefer-number算法转成primitive value; 2. 将该pfimitive value转成数字。

    prefer-string: 先调toString, 再调valueOf

    prefer-number: 先调valueOf, 再调toString

    no-preference: 如果是date, prefer-string; 如果不是date, perfer-number

    作用域:定义了变量被定义的范围。let和const都是块级作用域,即只能在它被定义的函数、类、循环体、选择体中存在。

    var和let的区别:var不是块级作用域,而是函数作用域;全局作用域中定义的var变量是global/window的属性,而let/const不是; var变量可以在作用域中重复声明,let/const不能。var有变量提升,let没有。

    发表回复

    *您的电子邮件地址不会被公开。必填项已标记为 。

    *
    *