本文介绍一些JS的特别的语法特性,大家面试前可以看看
// 注意,此时使用String()转换成字符串会是科学记数法的字符串
1000000000000000000000 // 1e+21,超出2^53,已经不准确了
1000000000000000001000.111111111 // 1e+21
0.0000001 // 1e-7
1.0000001 // 1.0000001,如果小数点前不为零,则不会用小数的科学记数法
0 / 0 // NaN
1 / 0 // Infinity
1 / -0 // -Infinity
NaN === NaN // false, == 也一样
// 第一个参数必为string类型,会进行数值转换(请牢记全部转成字符串)
// 第二个参数默认值10,可以接受[2,36]中的整数,如果是0、undefined、null则仍当做10
// 返回值只可能是十进制整数或NaN
// 不能识别科学记数法
parseInt(str, number)
parseInt(0.0000001) // 1,1e-7 => '1e-7' => 1
parseInt('') // NaN
[1,10,100,1000].map(parseInt) // [1, NaN, 4, 27]
// 和parseInt类似,只接受第一个字符串参数
// 能够识别科学记数法的表示
parseFloat(str)
parseFloat('1e-2float') // 0.01
parseFloat('') // NaN
Number('') // 0
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
Nmuber({}) // NaN
Nmuber([]) // 0
Number([23]) // 23
Nmuber([2, 3]) // NaN
var obj = {}
//值得注意的是
{} == {} // false,这里比较的是两个对象的地址
{} >= {} // true, 相当于比较:'[object Object]' >= '[object Object]'
+0 === -0 // true
Object.is(+0, -0) // false
NaN === NaN // false
Object.is(NaN, NaN) // true
function A () {} // 这里的A就可以作为构造函数对象
A.prototype // 构造函数的原型对象
A.prototype.constructor // 原型对象上的重要属性,指向构造函数本身
var exp = new A() // exp是A的一个实例
exp.__proto__ // 浏览器环境下存在,指向它的构造函数的原型对象
// 所以可以得出以下等式
A === A.prototype.constructor
A.prototype === exp.__proto__
A === exp.__prooto__.constructor
A.__proto__ // 这里是什么?A是Function构造函数的实例
function A (arg) {} // 这里的A就是构造函数
var obj = {} // 创建一个空对象,作为待返回的实例对象
obj.__proto__ = A.prototype // 将实例对象的原型属性指向构造函数的原型对象
/* this = obj // 将obj赋值给函数中的this,实际上这条语句无法也无需执行,只是为了便于理解 */
A.call(obj[, arg]) // 执行构造函数中的代码
// 以上三条语句的效果和 var obj = new A([, arg])是一样的
// 接受两个参数,一个是返回对象的原型对象,一个是属性描述对象的集合对象
Object.create(prototype[, propertyDescriptors])
// 它是以下语句的语法糖
var obj = {}
Object.setPrototypeOf(obj, prototype)
Object.defineProperties(obj, propertyDescriptors)
// 我们传递的只是callback函数在内存中的地址,而内存中的callback并没有绑定this
var a = function (callback) {
callback() // 没有绑定this
}
var b = function (callback) {
this.callback() // 绑定this
}
window.value = 2
a(function () {
console.log(this.value) // 2
})
b(function () {
console.log(this.value) // 2
})
a.call({value: 1}, function () {
console.log(this.value) // 2,因为callback没有在this上调用,那指向的就是window对象
})
b.call({value: 1}, function () {
console.log(this.value) // 1
})
1、《JavaScript 教程》