读《JS权威指南》

2021-05-09  本文已影响0人  春暖花已开

1、Number类定义的toString()方法可以接收表示转换基数的可选参数,如果不指定则基于十进制。同样,也可以将数字转换为其他进制数(范围2~36之间)

const num = 14
const numStr = num.toFixed(3)  // 14.000 保留三位小数
console.log(typeof numStr)  // string 获取类型

const b = num.toString(2)  // 1110 转化为二级制

const e = num.toString(8)  // 16 转化为八进制

const t = num.toString()  // 14  默认是十进制

const hex = num.toString(16)  // e 转化为十六进制

2、可选的分号
通常来说,如果一条语句“(”、“[”、“/”、“+” 或 “-” 开始,那么极有可能和前一条语句合在一起解析。比较常见的是以“(” 和 “[” 开始的语句。所以,就有些程序员喜欢保守地在语句前加上一个分号。

let y = x + f
(a + b).toString()
// 会被解析为
let y = x + f(a + b).toString()

如果当前语句和下一行语句无法合并解析,js会在第一行后填补分号,这是通用规则,但有两个例外:

// 例一
return
true;
js会解析成:
return; true;
而不是:
return true;

// 例二
x
++
y
js会解析成:
x; ++y;
而不是:
x++; y;

3、包装对象
字符串不是对象,但是有属性。原因在于,只要引用了字符串 s 的属性,js就会将字符串值通过 new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会销毁(其实在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样)。

同字符串一样,数字和布尔值也有各自的方法:通过Number()和Boolean()构造函数创建一个临时对象,这些方法的调用均来自于这个临时对象。null 和 undefined没有包装对象:访问他们的属性会造成一个类型错误。

name = 'Lynn'
name.len = 4  // 创建一个临时对象,并给其len属性赋值为4,随即销毁这个对象
console.log(name.len)  // 打印undefined,通过原始的字符串值创建一个新字符串对象,尝试读取其len属性,这个属性必然不存在

存取字符串、数字或布尔值的属性时,创建的临时对象称为包装对象,它只是偶尔用来区分值与对象。通常,包装对象被看做是一种实现细节,而不用特别关注。由于字符串、数字、布尔值的属性都是只读的,并且不能给它们定义新属性,因此需要明白它们是有别于对象的。


4、类型转换 js会根据需要自行转换类型。


5、转换和相等性


6、替换对象的方法(记录日志消息)

function trace(o, m) {
    const orgin = o[m]
    o[m] = () => {
        console.log(new Date().toLocaleString(), '---Entering---')
        const result = orgin.apply(this, arguments)
        console.log(new Date().toLocaleString(), '---Exiting---')
        return result
    }
}

// 使用
trace(obj, 'eat')
obj.eat()

7、高阶函数示例

// 定义一个高级函数(操作函数的函数)
function not(f) {
    return function() {
        var result = f.apply(this, arguments)
        return !result
    }
}

var even = function(x) {
    return x % 2 === 0
}

var odd = not(even)
const arr = [1, 3, 5]
arr.every(odd)

8、localStorage
localStorage作用域是限定在文档源级别的。文档源是通过协议、主机名及端口三者来确定的。


9、debug映射到实际文件

--sourcemap
上一篇 下一篇

猜你喜欢

热点阅读