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会在第一行后填补分号,这是通用规则,但有两个例外:
- 1、在涉及 return、break 和 continue语句的场景,如果这三个关键字后紧跟着换行,js会在换行处填补分号;
- 2、在涉及
++
和--
运算符的时候,这些运算符可以作为表达式的前缀,也可以作为后缀。
如:
// 例一
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
网友评论