首页 文章 精选 留言 我的

精选列表

搜索[JavaScript],共9118篇文章
优秀的个人博客,低调大师

Javascript如何判断是否是数组的四种方法?

一、通过instanceof判断:返回一个布尔值 let a = []; a instanceof Array; //true let b = {}; b instanceof Array; //false instanceof运算符检测Array.prototype属性是否存在于变量a的原型链上,显然变量a是一个数组,拥有Array.prototype属性,所以为true 存在问题: prototype属性是可以修改的,所以并不是最初判断为true就一定永远为真。 当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象,instanceof的验证结果可能不会符合预期,例如: //为body创建并添加一个iframe对象 var iframe = document.createElement('iframe'); document.body.appendChild(iframe); //取得iframe对象的构造数组方法 xArray = window.frames[0].Array; //通过构造函数获取一个实例 var arr = new xArray(1,2,3); arr instanceof Array; //false 导致这种问题是因为iframe会产生新的全局环境,它也会拥有自己的Array.prototype属性,让不同环境下的属性相同很明显是不安全的做法 所以Array.prototype !== window.frames[0].Array.prototype,想要arr instanceof Array为true,须保证arr为原始Array构造函数创建才可行。 二、通过constructor判断:返回一个构造函数 实例的构造函数属性constructor指向构造函数,通过constructor属性也可以判断是否为一个数组。 let a = [1,3,4]; a.constructor === Array;//true 这种判断也会存在多个全局环境的问题,导致的问题与instanceof相同。 //为body创建并添加一个iframe标签 var iframe = document.createElement('iframe'); document.body.appendChild(iframe); //取得iframe对象的构造数组方法 xArray = window.frames[window.frames.length-1].Array; //通过构造函数获取一个实例 var arr = new xArray(1,2,3); arr.constructor === Array;//false 三、通过Object.prototype.toString.call()判断:返回'[object Array]' Object.prototype.toString().call()可以获取到对象的不同类型 //检验是否为数组 let a = [1,2,3] Object.prototype.toString.call(a) === '[object Array]';//true //检验是否是函数 let b = function () {}; Object.prototype.toString.call(b) === '[object Function]';//true //检验是否是数字 let c = 1; Object.prototype.toString.call(c) === '[object Number]';//true //检验是否为对象 let d = {}; Object.prototype.toString.call(d) === '[object Object]' //true 对于多全局环境时, Object.prototype.toString().call()也能符合预期处理判断。 //为body创建并添加一个iframe标签 var iframe = document.createElement('iframe'); document.body.appendChild(iframe); //取得iframe对象的构造数组方法 xArray = window.frames[window.frames.length-1].Array; //通过构造函数获取一个实例 var arr = new xArray(1,2,3); console.log(Object.prototype.toString.call(arr) === '[object Array]');//true 四、通过Array.isArray()判断:返回一个布尔值 Array.isArray() 用于确定传递的值是否是一个数组,返回一个布尔值。 let a = [1,2,3] Array.isArray(a);//true 简单好用,且对于多全局环境,Array.isArray() 同样能准确判断, Array.isArray() 是在ES5中提出,可能会存在ES5之前不支持此方法的情况 解决方法: 配合Object.prototype.toString().call()进行封装 function checkArray(arg){ if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; } } 最终推荐:Array.isArray()方法 从ES5新增isArray()方法正是为了提供一个稳定可用的数组判断方法 对于ES5之前不支持此方法的问题,我们可以做好兼容进行自行封装

优秀的个人博客,低调大师

javascript中的变量在内存里面原来是这样的!

作者:极客小俊 一个专注于web技术的80后 你不用拼过聪明人,你只需要拼过那些懒人 你就一定会超越大部分人! 原创技术文章 博客: GeekerJun 标量类型的值 一般存储在栈区中! 标量指: 整型、浮点、字符串、布尔值、等.. 对象类型分为: 对象引用 和 对象体! 对象引用存储在栈区中 、对象体存储在堆区中、 1. 内存空间基本数据存储分析图1 注意: 一旦new一个对象,就必然会在内存中生成新的的区域来存储对象数据、 而且最重要的就是这个时候在内存中对象的地址是不一样的 , 因为 new 会生成一个新的地址在栈区中 2.对象引用类型地址传递分析图2 代码案例1: var json={ "username":"张三", "age":22, "fn1":function(){ console.log('我的名字叫'+this.username); } } //通过对象引用修改属性值1 /*function fn2(obj){ obj.username="李四"; } fn2(json);*/ //通过对象引用修改属性值2 var a=json; a.username='李四'; console.log(json.username); 分析图如下 3.对象引用类型地址传递分析图3 代码案例2: function Person(name,age,salary) { this.name=name; this.age=age; this.salary=salary; } function fn1(obj) { obj.name='王武'; obj=new Person('李四',24,8000); console.log(obj.name); } var obj=new Person('张三',33,6000); console.log(obj.name); //结果: 张三 fn1(obj); //结果 李四 console.log(obj.name); // 王武 分析图如下 对象引用 图分析小结: 在js中, 普通变量值作为函数的参数就是 值传递 在js中, 对象引用类型的变量作为函数的参数 就是 址传递! ​ 所以 注意一下 这里的值传递 与 址传递 一旦new一个对象 就一定会在堆区中创建一个空间,并赋予一个新地址 上面已经说过了! 4.对象数据的比较 在js中、基本数据类型数据的比较 是值的比较 值相同就可以了、 对象类型的比较 要满足两个要求、 第一是值要相同、第二引用地址也要相同才行 案例代码: //--案例1 var a=[1,2,3]; var b=[1,2,3]; console.log(a==b); //结果为false 虽然值一样,但地址是不同的! var a=[1,2,3]; var b=a; console.log(a==b); //结果为true 因为b指向了a这个地址,并且值也能够得到! 原理图 如下: 如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞 评论 收藏 一键三连哦! 如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留个言指出、或者你有更好的想法.

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册