JavaScript语言精粹-读书笔记(1)

JS 语言精粹 蝴蝶书

点击链接下载电子书

这本书需要基本的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值。

原型关系是动态的关系:如果我们给一个对象添加新的属性到原型中,那么该属性会对所有基于该原型创建的对象可见;

反射reflection

检查一个对象具有某个属性是很容易的事情;使用typeof可以获取对象的属性的数据类型。

存在一个问题:typeof对于原型中的任何属性都会产生值(例如construction 产生 function)
解决方案:1.让程序检查并丢掉函数的属性;2.使用hasOwnProperty方法,将对象中独有的属性返回,原型链中方法不会检查。

枚举 enumeration 循环遍历对象中的属性

遍历对象中的属性分为两种情况

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]]);
}

可以获取正确顺序的属性(不需要考虑原型链的属性)

删除属性 delete

删除对象的属性:如果对象具有某个属性,会删除这个属性。删除操作不会触及原型链中的任何对象及属性;删除这个对象的属性,如果原型链中还有这个属性,那么还可以获取这个属性(原型链上的属性);

减小全局变量的污染:使用let 创建局部变量在函数中。使用闭包形式向外暴露有限的接口。将全局性的资源加载到一个容器中,这样一个程序和其他程序的冲突就会降低。

你可能感兴趣的:(JavaScript,读书笔记)