资讯专栏INFORMATION COLUMN

Javascript查漏补缺

Airmusic / 3268人阅读

摘要:如果是自动创建的则其基本包装类对象只存在一瞬间。使用对象的函数对所有非字母数字进行编码。表示能否修改属性的值表示值访问器属性默认为。下面是同时进行多个属性的设置的语法示例设置为表示不能进行值的修改。

想复习一下javascript高级程序设计一书的内容,写下了下面的笔记,都是比较细的点,想到什么就写什么了,可能有点略杂。

Array数组部分

1.Array的length不仅是可读的,而且是可写的。这就意味着可以通过修改length来直接裁剪数组。如果length直接改大,那么没有赋值的地方为undefined

var a = [1,2,3];
a.length=2;
a;//[1,2]
a.length=3;
a;//[1,2,undefined]

2.Array.concat()可以接受很多个参数,并且也支持类型不一样的。将会返回连接之后的副本,不会修改原来的数组

var a = [1,2,3];
var b = a.concat("a",[3,4,5],1);
a;//[1,2,3]
b;//[1,2,3,"a",3,4,5,1]

3.splice()函数

参数数目 功能
两个参数Array.splice(startPos,delNum) 进行删除操作,第一个参数表示起始位置,第二个表示删除的个数
多个参数Array.splice(startPos,delNum,*insetElems) 删除并插入,前两个参数同上,之后的参数为在删除的位置需要插入的元素。如果第二个参数为0,仅进行插入操作。
函数Function和字符串String

1.要擅于利用arguments.callee进行解耦。我们在写递归函数的时候都会在函数内部调用自身函数,这时我们如果使用自身的函数名,函数内部就和函数名有耦合。我们直接使用arguments.callee就可以访问到函数名并进行调用

function addAll(n){
    if(n==1){return 1;}
    return n+addAll(n-1);
    return n+arguments.callee(n-1);//better!
}
var addAll_1 = addAll;
addAll_1(3);//error

2.引用类型和基本包装类型最主要的就是对象的生存期。如果是使用new创建的引用类型实例,那么执行流会一直生存到当前作用域结束。如果是自动创建的则其基本包装类对象只存在一瞬间

var s = "sad";
s.color = "red";
s.color;//null

3.使用new调用基本包装类性的构造函数和直接调用同名函数的结果是不一样的。

var number = Number("123");
typeof number;//number

var number2 = new Number("123");
typeof number2;//Object

4.由于字符串也是类似一个数组,我们想要对string使用Array方法,可以使用call或者apply

var str = "123";
Array.prototype.map.call(str,function(ele){console.log(ele);}

通过这个方法可以使用数组的很多方法,比如filter,forEach等。不过貌似很多地方都可以用类似这种模式。
5.数组的方法:trim(),concat()很多都不会修改原来数组的内容,只是创建副本并返回。
6.使用Global对象的encodeURIComponent()函数对所有非字母数字进行编码。decodeURIComponent()进行解码。这个之前写爬虫就爬到了很多类似于unicode的码u5168,或者在网页URI中的一些查询字符%E5%93%88%E5%93%88之类的也可以通过这个进行解码,还算是比较好用的一个函数啦。
7.利用bind()函数进行过一次绑定之后就再也不能够进行第二次绑定了。也就是说this已经被固定下来了。

var a = {name:"A"}
var b = {name:"B"}
function getName(){console.log(this.name);}
var getA = getName.bind(a);
getA();//A
var getB = getA.bind(b);
getB();//A

8.只要是继承的,进行instanceof检测的时候会返回true

a instanceof Object;//true
undefined instanceof Object;//false
null instanceof Object;//false
Object类的属性的属性

属性的属性就是指Object的属性的一些特性。分为数据属性访问器属性。数据属性是用来存储数据数值的,而访问器属性一般进行get/set操作,而不能进行数据的存储。
其中,数据属性分为四个:

1. [[Configurable]]表示能否通过delete删除属性从而重新定义属性
2. [[Enumerable]]表示能否通过for-in循环返回属性。
3. [[Writable]]表示能否修改属性的值
4. [[Value]]表示值

访问器属性

1.[[Configurable]]:默认为true。表示能否通过delete删除属性从而重新定义属性,能否修改属性特性,或者能否把属性修改为访问器属性;
2.[[Enumerable]]:默认为true。表示能否通过for-in循环返回属性;
3.[[Get]]:读取属性时调用的函数,默认为undefined;
4.[[Set]]:写入属性时调用的函数,默认为undefined。    

不能直接添加这些属性。只能用Object.defineProperty()或者Object.defineProperties()进行设置。例子如下

var a = {_name:123}

Object.defineProperty(a, "name", {
    get:function(){
        return "我是"+this._name;
    },
    set:function(newVal){
        if(newVal>20){
            this._name=newVal;
        }
    }
})

这里a并没有name这个属性,但是通过get()建立了从name_name的映射。可以使得数据属性的操作更加灵活。
下面是同时进行多个属性的设置的语法示例:(writable设置为false表示不能进行值的修改。)

Object.defineProperties(
    a,{_name:{value:23,writable:false},{name:{get:function(){return this._name;},set:function(){}}
        }
    }
)
原型链

可以通过对象实例来访问保存在原型中的值,但是不能通过对象实例来重写原型中的值,他会在实例的属性中添加这个值并且遮盖掉原型链中的值。但是通过__proto__.prop就可以访问到原型链中的prop属性。
即便是在实例中设置属性为null也不会消除对原型属性的遮蔽。除非使用delete

function Person(){
}
Person.prototype.name="aa";
var a = new Person();
var b = new Person();
a.name="bb";
b.name;//"aa"
a.name=null;
a.name;//null
a.__proto__.name;//"aa"
a.__proto__.name="bb";
b.name;//"bb"

可以通过hasOwnProperty()来获取到实例非原型链中是否有这个属性。

如果要判断实例有这个属性(包括原型链中的属性)用in这个操作符。
通过for-in循环返回的是对象能够访问到的(包括原型链),而且enumerable设置为true的属性

var c={name:"123",age:23};
Object.defineProperty(c,"name",{enumerable:false})
for(ele in c){console.log(ele);}//only age

如果要返回所有实例非原型链属性(不管是否可以枚举)

Object.keys(obj)//将返回所有可枚举的,属于实例对象的属性的属性名数组。
Object.getOwnPropertyNames(obj);//返回的是所有实例属性(不包括原型链),不管是否可枚举

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80711.html

相关文章

  • 前端背景知识查漏补缺

    摘要:提交内容可以是一个提议想法初步描述该阶段是对所提交新特性的正式建议。在这个阶段需具备以下条件指定一名成员作为审阅通过有实现的或者初步编写标准,包括问题描述解决方案示例语法语义关键的算法及抽象实现在的复杂度等该阶段是会出现标准中的第一个版本。 ECMAScript 与 JavaScript ECMAScript 是一套脚本语言的规范,内部编号 ECMA-262 该规范由 Ecma(Eu...

    developerworks 评论0 收藏0
  • 前端背景知识查漏补缺

    摘要:提交内容可以是一个提议想法初步描述该阶段是对所提交新特性的正式建议。在这个阶段需具备以下条件指定一名成员作为审阅通过有实现的或者初步编写标准,包括问题描述解决方案示例语法语义关键的算法及抽象实现在的复杂度等该阶段是会出现标准中的第一个版本。 ECMAScript 与 JavaScript ECMAScript 是一套脚本语言的规范,内部编号 ECMA-262 该规范由 Ecma(Eu...

    incredible 评论0 收藏0
  • 查漏补缺 - 收藏集 - 掘金

    摘要:酝酿许久之后,笔者准备接下来撰写前端面试题系列文章,内容涵盖浏览器框架分钟搞定常用基础知识前端掘金基础智商划重点在实际开发中,已经非常普及了。 这道题--致敬各位10年阿里的前端开发 - 掘金很巧合,我在认识了两位同是10年工作经验的阿里前端开发小伙伴,不但要向前辈学习,我有时候还会选择另一种方法逗逗他们,拿了网上一道经典面试题,可能我连去阿里面试的机会都没有,但是我感受到了一次面试1...

    YuboonaZhang 评论0 收藏0
  • 前端面试题-浏览器/服务端/网络

    摘要:同源策略是什么跨域通信同源两个文档同源需满足协议相同域名相同端口相同跨域通信进行操作通信时如果目标与当前窗口不满足同源条件,浏览器为了安全会阻止跨域操作。 同源策略是什么? javascript跨域通信 同源:两个文档同源需满足 协议相同 域名相同 端口相同 跨域通信:js进行DOM操作、通信时如果目标与当前窗口不满足同源条件,浏览器为了安全会阻止跨域操作。跨域通信通常有以下方法 ...

    jsdt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<