让js中数据类型所有的方法都通用起来
来源:互联网 发布:汽车修理app软件 编辑:程序博客网 时间:2024/06/05 19:58
数组可以拥有字符串的方法,字符串拥有数组的方法,而咱们的json一下就拥有了它俩人的方法。是不是很神奇?
ok,废话不多说了,其实我倒是喜欢管这种方法叫做数据类型欺骗。
首先先说一下js中两个比较接近的数据。一个叫数组一个叫json。
为什么先拿这两个讲呢?第一个它俩都是一个爹没错都是Obj。
再说一下他俩不一样的地方 首先json 没有length 准确的说 是json的length 是undefined 。 其实这只是这个对象的一个私有属性而已,因为没有这条私有属性,所以才是undefined。
而Array.prototype里面有length的方法。
第二个数组可以用中括号取到对应的值也就是
var a = [1,2,3];
a[0]//1
a[1]//2
中括号里面必须放数字,而这个特性其实json 算是支持的。这就是给了咱们一个可乘之机。
ok,现在就用json 伪造一个[1,2,3]的对象。
var a = {
'0':1
'1':2,
'2':2
} ;
在json中键值对中的key值只说明了不能用Number作为key值,ok既然如此,我可以用字符串的0,1,2.
这样如此做的话
a[0] //1
a[1] //2
似乎可以欺骗了系统了,当然还差最后一步也就是length
ok 我们直接赋予一个length;
var a = {
'0':1
'1':2,
'2':2,
length:3
} ;
这样的一个a 其实在输出的时候 和 [1,2,3] 就完全一样了。
说白了 我们已经用一个json 在不看内容的前提下其实可以完全骗过人的眼睛了 。
到底能不能骗过系统的眼睛呢?
在试验前我们先来讲一下对象的方法实现原理
其实所有的实例化对象的方法的函数 this 都是指向 你要操作的数据 最后在return 出this.
ok 咱们借助这个道理来试一试 用这个伪装的json 能不能用数组的方法。
首先咱们先试试slice
a.slice()//报错 没有该方法
[].slice.call(a) // 1,2,3 成功的骗过了浏览器
我们在深入一点试试
Array.prototype.slice.call(a,1)// 2,3 确实截取到了
当然 如果 这个json 对象没有length的属性的时候 则会返回一个空数组 说明数组的length 在这个方法中是会用到的。而咱们的json 有了和数组一样的所有东西后,在变成这个方法的this之后,其实也可以骗过浏览器来执行数组的方法。
当然咱们再来一个比较稍微高难度的例子吧
数组有一堆属于自己的循环 例如 find 、 forEach 、findIndex咱们就试验最后一个吧;
[].findIndex.call(a,(function(e,index){
console.log(e);1,2,3
console.log(index); 0,1,2
}));
一点问题都没有,其实实测之后 发现数组的大部分方法都可以使用,这也就是说明了 json 完全也可以使用数组的方法,不过json 要使用的话,还需要key值 和length 符合象数组一样。 不过似乎也没啥意义了。
当然json 可不可以用字符串的方法呢?
var a = '123';
和
var a = {
'0':'1'
'1':'2',
'2':'2',
length:3
} ;
似乎在输出的时候没有什么明显的差异
他们的a[0] 都是1,length也都是3。
ok让我们试试
''.substring.call(a)//'[object object]'
可以使用没有报错 也就是说substring 认这个东西了 但是 内部他到内部就暴露了真实的自己他是一个对象 解析出来的this 就是obj 最后也会return 出这个东西来
当然你会说 字符串也有new String 如果把这个放进去 会出现问题么?
来,带着疑问我们来看看。
var a = new String('123');
''.substring.call(a) //'123';
而我试验了几个方法之后发现虽然没报错,但是输出都是字符串'[object object]'
人家字符串自己的对象却是一点都没事,这其实也深度反应了一个问题。字符串的对象虽然具有对象的引用或者说是私有属性所有特性,但是和array和obj的对象还是有一些本质的差别。
当然玩完了json,咱们来试试 数组玩字符串的。
var a = [1,2,3];
''.substring.call(a,1)//,2,3;
没报错,而且数组也刷了一回字符串的substring 方法,超级酷。但是截取值确有些不是我们想要的。
是',2,3';
其实不难发现 是到了内部数组变成了 '1,2,3',从第一个开始截取 自然最后就出现了',2,3';
其实试验了几种方法之后,发现字符串对数组还是蛮友好的,大部分都是支持的,但是你的数组放进去之后,会自动转换成字符串带逗号的.就像[1,2,3]转化成'1,2,3';
不过数组方法对字符串其实就没那么友好了,不过有些方法还是蛮好使的。
例如
[].slice.call('123',1)//['2','3'];
变成了一个数组的['2','3'] 也就是‘123’在进去后自动变成了 一个['1','2','3']在从第一位开始截取的话 就变成['2','3']了,似乎效果不错 因为省下了split('')步骤,不过它也是只能一个字母一个字母变成分割,变成数组。
不过一些别的方法就没着么走运了 例如
var a = '123';
[].push.call(a,'4')//报错
其实试验了大部分,发现可以用的确实不多,不过还是有一小部分可以使用。
反正这个东西其实在实战中没有什么实际的意义,不过如果要说的话就是其实数组,字符串,json的方法部分是可以通用的。
ok,废话不多说了,其实我倒是喜欢管这种方法叫做数据类型欺骗。
首先先说一下js中两个比较接近的数据。一个叫数组一个叫json。
为什么先拿这两个讲呢?第一个它俩都是一个爹没错都是Obj。
再说一下他俩不一样的地方 首先json 没有length 准确的说 是json的length 是undefined 。 其实这只是这个对象的一个私有属性而已,因为没有这条私有属性,所以才是undefined。
而Array.prototype里面有length的方法。
第二个数组可以用中括号取到对应的值也就是
var a = [1,2,3];
a[0]//1
a[1]//2
中括号里面必须放数字,而这个特性其实json 算是支持的。这就是给了咱们一个可乘之机。
ok,现在就用json 伪造一个[1,2,3]的对象。
var a = {
'0':1
'1':2,
'2':2
} ;
在json中键值对中的key值只说明了不能用Number作为key值,ok既然如此,我可以用字符串的0,1,2.
这样如此做的话
a[0] //1
a[1] //2
似乎可以欺骗了系统了,当然还差最后一步也就是length
ok 我们直接赋予一个length;
var a = {
'0':1
'1':2,
'2':2,
length:3
} ;
这样的一个a 其实在输出的时候 和 [1,2,3] 就完全一样了。
说白了 我们已经用一个json 在不看内容的前提下其实可以完全骗过人的眼睛了 。
到底能不能骗过系统的眼睛呢?
在试验前我们先来讲一下对象的方法实现原理
其实所有的实例化对象的方法的函数 this 都是指向 你要操作的数据 最后在return 出this.
ok 咱们借助这个道理来试一试 用这个伪装的json 能不能用数组的方法。
首先咱们先试试slice
a.slice()//报错 没有该方法
[].slice.call(a) // 1,2,3 成功的骗过了浏览器
我们在深入一点试试
Array.prototype.slice.call(a,1)// 2,3 确实截取到了
当然 如果 这个json 对象没有length的属性的时候 则会返回一个空数组 说明数组的length 在这个方法中是会用到的。而咱们的json 有了和数组一样的所有东西后,在变成这个方法的this之后,其实也可以骗过浏览器来执行数组的方法。
当然咱们再来一个比较稍微高难度的例子吧
数组有一堆属于自己的循环 例如 find 、 forEach 、findIndex咱们就试验最后一个吧;
[].findIndex.call(a,(function(e,index){
console.log(e);1,2,3
console.log(index); 0,1,2
}));
一点问题都没有,其实实测之后 发现数组的大部分方法都可以使用,这也就是说明了 json 完全也可以使用数组的方法,不过json 要使用的话,还需要key值 和length 符合象数组一样。 不过似乎也没啥意义了。
当然json 可不可以用字符串的方法呢?
var a = '123';
和
var a = {
'0':'1'
'1':'2',
'2':'2',
length:3
} ;
似乎在输出的时候没有什么明显的差异
他们的a[0] 都是1,length也都是3。
ok让我们试试
''.substring.call(a)//'[object object]'
可以使用没有报错 也就是说substring 认这个东西了 但是 内部他到内部就暴露了真实的自己他是一个对象 解析出来的this 就是obj 最后也会return 出这个东西来
当然你会说 字符串也有new String 如果把这个放进去 会出现问题么?
来,带着疑问我们来看看。
var a = new String('123');
''.substring.call(a) //'123';
而我试验了几个方法之后发现虽然没报错,但是输出都是字符串'[object object]'
人家字符串自己的对象却是一点都没事,这其实也深度反应了一个问题。字符串的对象虽然具有对象的引用或者说是私有属性所有特性,但是和array和obj的对象还是有一些本质的差别。
当然玩完了json,咱们来试试 数组玩字符串的。
var a = [1,2,3];
''.substring.call(a,1)//,2,3;
没报错,而且数组也刷了一回字符串的substring 方法,超级酷。但是截取值确有些不是我们想要的。
是',2,3';
其实不难发现 是到了内部数组变成了 '1,2,3',从第一个开始截取 自然最后就出现了',2,3';
其实试验了几种方法之后,发现字符串对数组还是蛮友好的,大部分都是支持的,但是你的数组放进去之后,会自动转换成字符串带逗号的.就像[1,2,3]转化成'1,2,3';
不过数组方法对字符串其实就没那么友好了,不过有些方法还是蛮好使的。
例如
[].slice.call('123',1)//['2','3'];
变成了一个数组的['2','3'] 也就是‘123’在进去后自动变成了 一个['1','2','3']在从第一位开始截取的话 就变成['2','3']了,似乎效果不错 因为省下了split('')步骤,不过它也是只能一个字母一个字母变成分割,变成数组。
不过一些别的方法就没着么走运了 例如
var a = '123';
[].push.call(a,'4')//报错
其实试验了大部分,发现可以用的确实不多,不过还是有一小部分可以使用。
反正这个东西其实在实战中没有什么实际的意义,不过如果要说的话就是其实数组,字符串,json的方法部分是可以通用的。
阅读全文
0 0
- 让js中数据类型所有的方法都通用起来
- 对所有对象都通用的方法
- 所有对象都通用的方法
- 对所有对象都通用的方法
- 对于所有对象都通用的方法
- 对于所有对象都通用的方法
- 对于所有方法都通用的对象
- 对于所有对象都通用的方法
- 对于所有对象都通用的方法
- 对于所有对象都通用的方法
- 对于所有对象都通用的方法
- Java中对于所有对象都通用的方法之——equals
- Effective Java:对于所有的对象都通用的方法
- effective java(对于所有对象都通用的方法)
- Effective Java-2 对所有对象都通用的方法
- Effective Java:对于所有对象都通用的方法
- 对于所有对象都通用的方法(二)
- 第3章 对于所有对象都通用的方法
- 关于java的绝对路径和相对路径问题
- android 开发中常用的第三方库(图片加载篇——Glide)
- js 处理接收到的数据
- Platform来获取一些系统的路径和参数
- Spring Cloud构建微服务架构:服务网关(过滤器)【Dalston版】
- 让js中数据类型所有的方法都通用起来
- Hikaricp源码解读(2)——配置介绍及对应源码
- vue-cli入门(一)——项目结构
- firefly rk3399内核编译命令
- IOS CoreText系列四:图文混排之点击事件
- NOJ(1541)-分支限界-加1乘2平方
- 三子棋
- spring boot 入门
- 简单的用C语言调用Sqlite3