美文网首页
you don't know JavaScript(1)

you don't know JavaScript(1)

作者: drunkcat2020 | 来源:发表于2016-09-09 21:02 被阅读0次

    you don't know JavaScript

    object

    1. 对象的两种创建方式

    字面量的方式,new操作符创建

    1. 在对象中引用、创建、其他对象或函数的本质含义

    都只是对函数的引用,函数不属于任何对象。

    1. 对象的属性描述符有哪些?

    vaule

    writable

    configurble

    enumberable

    get

    set

    1. 对对象进行一些限制性操作:冻结、常量化、封装、密封;不同的操作之间的联系?

    常量化:writable:false;configurable:false;

    禁止扩展:Object.preventExtensions();

    密封:Object.seal();世家还是那个等于:Object.preventExtensions() + configurable:false;

    冻结:Object.freeze();等于将对象密封后且不可读,即Obejct.seal() + writable:false;

    1. 访问对象属性和查找对象属性的本质?

    通过描述符中set get去操作

    1. 对对象属性的遍历和对数组的遍历有何不同?

    对属性的遍历相当于对索引的遍历,而数组也可以对索引进行遍历,但我们往往最关心的是数组的值,所以存在遍历数组值得方法

    1. enumerable 可控制对象的属性是否可以出现在遍历中,为false时属性不会出现在for in 循环中

    2. 反问对象的属性,和访问一个变量在内部机制上有什么不同?

    当访问一个对象及其原型链中不存在的属性时,会返回undefined,但访问一个当前词法作用域中不存在的变量时,会抛出一个ReferenceError异常。

    1. 检查一个对象中是否有某属性的两种方法?

    2. in 方法可以检测对象中的属性是否存在,问什么不能检测数组中是否有某值?

    3. for in 循环遍历的是什么?为什么不能用它来遍历数组中的值?

    4. 涉及Object 属性的一些操作方法有哪些?

    5. 去查找对象的属性时,若对象中不存在该属性会顺着原型链回溯去查找该属性值,怎样区别属性是对象自身的属性还是原型链上的属性?

    Object.hasOwnPeoperty( );

    1. 什么是深不变性和浅不变性?

    2. in操作和Object.hasOwnProperty( )的区别?

    (property in Object)会检查该property是否存在于对象中以及它的原型链中;(in操作符只会检查属性名是否存在,而不会检查值,所以不要用in操作符来检查数组中的值)

    Object.hasOwnPropery()只会检查该property是否在在该对象中而不会延伸到对象的prototype中去。

    1. 在对象和数组中应用for-in操作有什么不同?

    由于for-in不仅会遍历值得索引,还会遍历所有属性,所以如果用for-in来遍历数组可能会造成数值和属性混杂的问题。

    --

    • JavaScript中9种内置对象类型和5种基本类型?

    JavaScript中的内置对象实际上是一些内置的函数,通过内置函数、new操作符可以创建一个对应子类型的对象。通过字面量创建和通过内置函数创建的不同点在于使用 typeof 检测出来的类型不一样,如:

    
    var str1 = 'i am a coder';
    
    var str2 = new String("i am a coder");
    
    typeof str1;//string
    
    typeof str2;//object
    
    str1 instanceof String;//true
    
    str2 instanceof object;//false
    
    

    但内置对象中的null 、 undefined属于特殊情况,它们只有自己的文字形式而没有构造形式。

    • 对象的属性名都是字符串,即便是数组也是如此,数组的下标就可以理解成是对象的属性名,它们都是字符串形式。

    • 理解在对象中引用函数的本质,如:

    
    var person = {
    
    name:['jack','lina','ellon'],
    
    findId:function() {
    
    ...//具体的函数操作
    
    },
    
    searchTel:searchTel
    
    };
    
    function searchTel() {
    
    ...//具体函数操作
    
    };
    
    

    从技术角度讲,函数永远不属于任何对象####

    具体讲:对象中属性访问的函数和其他函数没有任何区别,(除了可能发生的隐式绑定this外);上面代码块中的findId 和searchTel 都是对两个不同的函数的引用,都不能说是属于person这个对象,即便findId是在person中定义的。

    • 数组也属于对象,所以也可以给数组添加新属性,但给数组添加一个命名属性并不会增加数组的长度(这个新属性的属性名要看起来不是一个整数),如果你给Array 添加的新属性的属性名看起来像一个整数,则JavaScript引擎会把它当做是数组的新值得下标,数组的Length也会随之增长。

    • 属性描述符有哪些?

    configurable

    enumberable

    writable

    value

    get

    set

    • configurble:false;可以禁止对属性的属性描述符进行更改,包括删除该属性;但可以对该属性重新赋值。

    • delete 可以用来删除属性,但delete仅仅只是删除而已,并不具备释放内存的功能。

    对象的一些操作方法:

    Object.assign()

    Object.defineProperty()

    相关文章

      网友评论

          本文标题:you don't know JavaScript(1)

          本文链接:https://www.haomeiwen.com/subject/bfvxettx.html