点击链接下载电子书
这本书需要基本的JS基础和一定的经验。第一次看感觉很普通,工作一段时间后发现这本书很多细节很重要。这本书基于 ECMA3版本写的,现在已经普遍使用ECMA6版本,所以部分知识需要更新。
原作者电子书网址:https://www.crockford.com/books.html
JS 语言的特殊性造成了精华和糟粕并存,所以我们要合理使用这部分内容
// page 18
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
}
在JS中使用注释最好使用//。不使用/**/的形式。因为正则表达式和注释可能发生冲突造成语法错误。
在JS中number就是64位的浮点数,没有int的概念。所以在JS中1.0 === 1
指数:100 = = = 1e2 = = = 1 * 10 * 10
字符串是不可变的:如果使用+进行连接,那么是创建一个新的字符串(并不是在原来的基础上加一个字符)。
'cat'.length === 3
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key);
}
}
判断属性名来自于对象的成员还是原型链
try-catch-throw 还是不熟练
typeof(null) => ‘Object’
在JS中%表示取余数。当两个运算数都是正数和求模运算一致,但是存在负数,就出现不一致的情况。
公用的函数的方法可以放在对象的原型中(在es6中react中,直接放在组件的类中,作为组件的方法实现复用效果)。私有的方法单独作为对象的方法直接添加即可。
if (typeof Object.beget !== 'function') {
Object.create = function(o) {
var F = function() {};
F.prototype = o;
return new F();
};
}
var another = Object.create(stooge);
another.nickname = "Moe";
原型连接在更新时是不起作用的。当我们对于对象作出改变,不会触及该对象的原型;
hasOwnproperty 会检查对象的属性,不会检查对象原型链上的属性
如果尝试获取某个对象的属性值,但是这个对象没有对应的属性名,那么就会去原型链中逐层寻找这个属性。如果到达终点的Object.prototype没有,返回一个undefined值。
原型关系是动态的关系:如果我们给一个对象添加新的属性到原型中,那么该属性会对所有基于该原型创建的对象可见;
检查一个对象具有某个属性是很容易的事情;使用typeof可以获取对象的属性的数据类型。
存在一个问题:typeof对于原型中的任何属性都会产生值(例如construction 产生 function)
解决方案:1.让程序检查并丢掉函数的属性;2.使用hasOwnProperty方法,将对象中独有的属性返回,原型链中方法不会检查。
遍历对象中的属性分为两种情况
1.未知对象的属性名:使用for-in遍历对象的属性,使用typeof过滤函数,使用hasOwnProperty过滤原型链的部分。
for (let name in object) {
if(typeof object[name] !== 'function') {
console.log(name + ':' + object[name]);
}
}
2.已知函数的属性名:使用一个数组存放函数的属性名;获取数组的长度i,使用for遍历对象的属性值。
let properties = ['name', 'age', 'sex'];
for (let i = 0; i < properties.length; i++) {
console.log(properties[i] + ":" + object[properties[i]]);
}
可以获取正确顺序的属性(不需要考虑原型链的属性)
删除对象的属性:如果对象具有某个属性,会删除这个属性。删除操作不会触及原型链中的任何对象及属性;删除这个对象的属性,如果原型链中还有这个属性,那么还可以获取这个属性(原型链上的属性);
减小全局变量的污染:使用let 创建局部变量在函数中。使用闭包形式向外暴露有限的接口。将全局性的资源加载到一个容器中,这样一个程序和其他程序的冲突就会降低。