你不知道的javascript 读书笔记

你不知道的javascript

[]==false true
[]=='' true
''==false true

[]==Array() false
[]===false false
''===false false

null==undefined true
null==false false
undefined==false false
null==true false
null==0 false
undefined==0 false
undefined==‘’ false
null=='' false

Object

Object.getOwnPropertyDescriptor(obj, prop)
检索对象自有属性,存在则返回{属性描述符对象},否则返回undefined

Object.getOwnPropertyDescriptors(obj)
返回对象所有{自身属性的描述符},没有则返回空对象

Object.getPrototypeOf(obj)
返回指定对象的原型对象

Object.getOwnPropertyNames()
返回对象的所有自身属性的属性名(包括不可枚举属性)组成的数组

Object.getOwnPropertySymbols()
返回包含了指定对象自身的(非继承的)所有 symbol 属性键的数组

Object.keys()
返回对象所有可枚举属性名 组成的数组 [name,age]
Object.entries()
返回对象所有可枚举属性的键值对 组成的数组 [[name, “yiqian”],[age, 30]]
Object.values()
返回对象所有可枚举属性的值 [“yiqian”, 30]

for-in 循环
枚举对象自身包括其原型链上的属性

Object.is(a,b)
比较两个值是否是相同的值(不做隐式的类型转换 )
但:Object.is(true,!0) === true 为什么? !0为表达式,会先求值得出true
另:判断两个NaN相等只能使用 Object.is(NaN,NaN)
特例: Object.is(NaN, 0/0) === true

一些概念:
对象与对象属性的描述对象
对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为

描述对象的enumerable属性,称为”可枚举性“,如果该属性为false,就表示某些操作会忽略当前属性。
ES5有三个操作会忽略enumerable为false的属性。

  •   for...in循环:只遍历对象自身的和继承的可枚举的属性
    
  •   Object.keys():返回对象自身的所有可枚举的属性的键名
    
  •   JSON.stringify():只串行化对象自身的可枚举的属性
    

ES6新增了一个操作Object.assign(),会忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
这四个操作之中,只有for...in会返回继承的属性。实际上,引入enumerable的最初目的,就是让某些属性可以规避掉for...in操作。比如,对象原型的toString方法,以及数组的length属性,就通过这种手段,不会被for...in遍历到。

方法的name属性
const person = { sayName() {console.log('hello!') } };
person.sayName.name === "sayName"

如果对象的方法使用了取值函数(getter)和存值函数(setter),则name属性不是在该方法上面,而是该方法的属性的描述对象的get和set属性上面
const obj = { get foo() {}, set foo(x) {} };
obj.foo.name // TypeError: Cannot read property 'name' of undefined
const descriptor = Object.getOwnPropertyDescriptor(obj, 'foo');
descriptor.get.name // "get foo"
descriptor.set.name // "set foo"

有两种特殊情况:bind方法创造的函数,name属性返回bound加上原函数的名字;Function构造函数创造的函数,name属性返回anonymous。
(new Function()).name // "anonymous"

var doSomething = function() {
// ...
};
doSomething.bind().name // "bound doSomething"
如果对象的方法是一个 Symbol 值,那么name属性返回的是这个 Symbol 值的描述。
const key1 = Symbol('description');
const key2 = Symbol();
let obj = {
key1 {},
key2 {},
};
obj[key1].name // "[description]"
obj[key2].name // ""
上面代码中,key1对应的 Symbol 值有描述,key2没有。

Object.isExtensible(empty)
检测对象是否可扩展
var empty = {}; Object.isExtensible(empty) === true // 新对象默认是可扩展的.
Object.preventExtensions(empty); Object.isExtensible(empty) === false // ...可以变的不可扩展.
var sealed = Object.seal({}); Object.isExtensible(sealed) === false // 密封对象是不可扩展的.
var frozen = Object.freeze({}); Object.isExtensible(frozen) === false // 冻结对象也是不可扩展.

Object.isSealed(empty) 检测对象是否被密封(sealed)
Object.isFrozen(obj) 检测对象是否被冻结(frozen)

也就是说不论是空对象还是非空对象,默认都是非密封非冻结的
//空对象可扩展,非密封非冻结
Object.isSealed({})=== false
Object.isFrozen({}) === false

// 不可扩展的空对象,是密封的,也是冻结的
let empty={};
Object.preventExtensions(empty);
Object.isSealed(empty) === true
Object.isFrozen(empty) === true

// 非空对象变的不可扩展,非密封的(因为密封对象的所有自身属性必须是不可配置的)
var hasProp = { fee: "fie foe fum" , p:42};
Object.preventExtensions(hasProp);
Object.isSealed(hasProp) === false
// 非空对象变的不可扩展,并不一定冻结的,(因为p属性仍然是可以配置的,而且可写的)
Object.isFrozen(hasProp) === false
// 如果删除p属性,则它会成为一个冻结对象.
delete hasProp.p;
Object.isFrozen(hasProp) === true
// 不可扩展对象,如果拥有一个(不可写但可配置)的属性, 非冻结的.非密封的
Object.defineProperty(hasProp, "fee”, { writable: false }); // 变得不可写
Object.isFrozen(hasProp) === false
// 不可扩展的对象,拥有一个(不可配置但可写)的属性, 非冻结的,密封对象
Object.defineProperty(hasProp, “fee”, { configurable: false,writable: true });
Object.isFrozen(hasProp) === false
// 把这个属性改为不可配置(不可写不可配置)冻结对象,密封对象.
Object.defineProperty(hasProp, "e", { configurable: false, writable: false }); // 变得不可配置
Object.isFrozen(hasProp) === true
Object.isSealed(hasProp) === true

// 一个不可扩展的对象,只拥有一个访问器属性,非冻结的.
var accessor = { get food() { return "yum"; } };
Object.preventExtensions(accessor);
Object.isFrozen(accessor) === false
// 把这个属性改为不可配置, 冻结对象.
Object.defineProperty(accessor, "food", { configurable: false });
Object.isFrozen(accessor) === true

// 生成冻结对象
var frozen = { 1: 81 };
Object.freeze(frozen)
// 一个冻结对象也是一个密封对象.
Object.isSealed(frozen) === true
// 更是一个不可扩展的对象.
Object.isExtensible(frozen) === false

//生成密封对象
var sealed = {};
Object.seal(sealed)
// 一个密封对象同时也是不可扩展的.
Object.isExtensible(sealed) === false
// 一个密封对象也可以是一个冻结对象,但不是必须的.
Object.isFrozen(sealed) === true ,所有的属性都是不可写的
var s2 = Object.seal({ p: 3 });
Object.isFrozen(s2) === false, 属性"p"可写
var s3 = Object.seal({ get p() { return 0; } });
Object.isFrozen(s3); // === true ,访问器属性不考虑可写不可写,只考虑是否可配置

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容