一.六种数据类型
五种原始类型:number、string、boolean、null、undefined
一种对象类型:object,它包括Function、Array、Date等等
二.隐式转换
“37”-7,结果:30
“37”+7,结果:377
var x='The answer is ' + 42;结果:'The answer is 42'
巧用+/-规则转换类型,如 num-0:转换成数字类型;num+'':转换成字符串类型
“1.23”==1.23,0==false,null==undefined这些是相等的;new Object()==new Object(),[1,2]==[1,2]这些对象类型是不相等的。
a===b:类型不同,返回false,类型相同:null === null,undefined === undefined,NaN!=NaN,new Object != new Object
a==b:类型相同,同===;类型不同,尝试类型转换和比较:
null==undefined 相等 number == string 转number 1=="1.0"//true boolean == ? 转number 1==true//true object == number | string 尝试对象转为基本类型 new String('hi') == 'hi' //true,其它:false
三.包装对象
在JavaScript中,当尝试将一个基本类型以对象方式使用时,如访问它的length属性,给它增加一些属性,JavaScript会很智能的将这基本类型包装成相应的对象类型,相当于new。
当a.length返回或a.t设置以后,这个临时对象会被销毁掉,数字、boolean同理,通过(123).toString()能将其转换成字符串也是类似的原理。
四.类型检测
1.typeof
typeof会返回一个字符串,它非常适合函数类型和基本类型的判断。
typeof 100 "number" typeof true "boolean" typeof function "function" typeof(undefined) "undefined" typeof new Object() "object" typeof [1,2] "object" typeof NaN "number" typeof null "object"
2.instanceof
判断对象类型更适合用instanceof,它是基于原型链判断的操作符。希望左操作数是一个对象,如果不是一个对象,将直接返回false;希望右操作数是一个函数对象(函数构造器),如果不是的话,就会抛出TYPE ERROR异常。
原理:判断左边的操作数的原型链上是否有右边这个构造函数的prototype属性。
[1,2] instanceof Array === true new Object() instanceof Array === false
注意:不同window或iframe间的对象类型检测不能使用instanceof。
3.Object.prototype.toString
Object.prototype.toString.apply([]) === "[object Array]" Object.prototype.toString.apply(function(){}) === "[object Function]" Object.prototype.toString.apply(null) === "[object Null]" Object.prototype.toString.apply(undefined) === "[object Undefined]"
注意:IE6/7/8 Object.prototype.toString.apply(null)返回"[object Object]"。
4.constructor
任何一个对象都有一个constructor属性(实际上是继承自原型的),constructor会指向构造这个对象的构造函数,但由于constructor可以被改写的,使用的时候需小心。
5.duck type
如不知道这个对象是不是数组,可以判断它的length是不是数字,是不是有join、push等方法。通过一些特征判断这个对象是否属于某个类型。
6.类型检测小结:
typeof:适合基本类型及function检测,遇到null失效。
Object.prototype.toString:通过{}.toString拿到,适合内置对象和基本元素类型,遇到null和undefined失效(IE678等返回[object Object])。
instanceof:适合自定义对象,也可以用来检测原生对象,在不同iframe和window间检测时失效。
五.练习
请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
2. 数组的长度一致。
3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.
当以上全部满足,则返回"判定结果:通过",否则返回"判定结果:不通过"。
index.html
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb18030"> <title>Untitled Document</title> </head> <body> <script type="text/javascript"> /* * param1 Array * param2 Array * return true or false */ function arraysSimilar(arr1, arr2){ //判断边界 if(!(arr1 instanceof Array) || !(arr2 instanceof Array)) { return false; } //判断长度 if(arr1.length !== arr2.length) return false; var i=0, n=arr1.length, countMap1 = {}, countMap2 = {}, t1,t2, TYPES = ['string', 'boolean', 'number','undefined','null','function','date','window']; for(;i<n;i++) { t1 = typeOf(arr1[i]); t2 = typeOf(arr2[i]); if(countMap1[t1]) { countMap1[t1]++; }else { countMap1[t1]=1; } if(countMap2[t2]) { countMap2[t2]++; }else { countMap2[t2] = 1; } } function typeOf(ele) { var r; if(ele === null) { r='null'; }else if(ele instanceof Array) { r='array'; }else if(ele === window) { r='window'; }else if(ele instanceof Date) { r='date'; }else { r=typeof ele; } return r; } for(i=0,n=TYPES.length;i<n;i++) { if(countMap1[TYPES[i]] !== countMap2[TYPES[i]]) { return false; } } return true; } </script> <script src="testData.js"></script> </body> </html>
testData.js
var result=function(){ //以下为多组测试数据 var cases=[{ arr1:[1,true,null], arr2:[null,false,100], expect:true },{ arr1:[function(){},100], arr2:[100,{}], expect:false },{ arr1:[null,999], arr2:[{},444], expect:false },{ arr1:[window,1,true,new Date(),"hahaha",(function(){}),undefined], arr2:[undefined,(function(){}),"okokok",new Date(),false,2,window], expect:true },{ arr1:[new Date()], arr2:[{}], expect:false },{ arr1:[window], arr2:[{}], expect:false },{ arr1:[undefined,1], arr2:[null,2], expect:false },{ arr1:[new Object,new Object,new Object], arr2:[{},{},null], expect:false },{ arr1:null, arr2:null, expect:false },{ arr1:[], arr2:undefined, expect:false },{ arr1:"abc", arr2:"cba", expect:false }]; //使用for循环, 通过arraysSimilar函数验证以上数据是否相似,如相似显示“通过”,否则"不通过",所以大家要完成arraysSimilar函数,具体要求,详见任务要求。 for(var i=0;i<cases.length;i++){ if(arraysSimilar(cases[i].arr1,cases[i].arr2)!==cases[i].expect) { document.write("不通过!case"+(i+1)+"不正确!arr1="+JSON.stringify(cases[i].arr1)+", arr2="+JSON.stringify(cases[i].arr2)+" 的判断结果不是"+cases[i].expect); return false; } } return true; }(); document.write("判定结果:"+(result?"通过":"不通过"));
打开index.html,效果如下:
相关推荐
"深入浅出JavaScript"这本书显然旨在帮助读者全面理解这种强大的编程语言,包括其核心概念、语法以及实际应用。 JavaScript的基础部分涵盖变量、数据类型、控制流(如条件语句和循环)、函数等。变量是存储数据的...
《李炎恢Javascript笔记》是一本深入浅出的JavaScript学习资料,它涵盖了JavaScript的基础到实践应用的诸多方面。这本书的特点是将复杂的编程概念分解为易于理解的小知识点,并且提供了源码示例,使得读者能够更好地...
【标题】:“大佬的前端学习笔记”是一份深入浅出的前端开发资源,包含了Web开发中的核心语言和技术,如Node.js、JavaScript、Axios、jQuery和HTML。这份笔记旨在帮助开发者提升前端技能,掌握现代Web开发的最佳实践...
张孝祥是一位知名的编程教育者,他的JavaScript教程以其深入浅出的讲解方式深受广大程序员喜爱。他的笔记涵盖了JavaScript的核心概念、语法、数据类型、控制结构、函数、对象、数组、字符串、正则表达式、DOM操作、...
JavaScript,简称为JS,是一种广泛应用于Web开发的轻量级脚本语言。...在网页设计中,JavaScript扮演着至关重要的角色,因为它允许开发者...韩顺平老师的课程提供了深入浅出的讲解,对于初学者来说是一份很好的学习资源。
这本书深入浅出地介绍了JavaScript的基础知识,帮助读者掌握这门强大的脚本语言。JavaScript是一种广泛应用于Web开发的编程语言,它在网页交互、动态效果以及前后端数据交换等方面发挥着重要作用。 本书涵盖了1-15...
"韩顺平html+css+javascript笔记"是一套全面的前端学习资料,韩顺平是一位知名的编程教育专家,他的讲解通常深入浅出,适合初学者。笔记中可能涵盖了HTML的基本结构和语义化,CSS的选择器、布局和动画,以及...
林信良的学习笔记《AjaxGossip》深入浅出地介绍了Ajax的核心概念和技术细节,对于初学者来说是一份非常实用的教程。 **Ajax基础** 1. **XMLHttpRequest对象**:Ajax的核心是XMLHttpRequest对象,它允许JavaScript...
本教程由北风网知名讲师CJ主讲,旨在深入浅出地讲解这三门技术,帮助学习者掌握现代Web开发的核心技能。 首先,JavaScript 是一种轻量级的解释型编程语言,主要用于客户端的网页开发。它赋予了网页动态性,允许...
《JavaScript忍者秘籍(第2版)》是JavaScript编程领域的一本经典之作,它深入浅出地介绍了JavaScript的核心概念和技术。这本书不仅包含了基础语法,还涵盖了高级特性,旨在帮助读者成为JavaScript的高手,即“忍者...
韩顺平老师的2023年JavaScript课堂实录笔记深入浅出地介绍了JS的核心概念和应用。 首先,JavaScript在网页中的应用非常广泛,包括地图搜索、网页游戏、用户输入验证(如邮箱、数字、身份证、IP地址等)、股市数据...
这份笔记通过深入浅出的方式,系统地讲解了JavaScript从基础到高级的各个方面,无论你是初学者还是有经验的开发者,都能从中受益。通过阅读和实践,你将能够掌握JavaScript的核心技术和最佳实践,为在Web开发领域...
这样的教程通常会深入浅出地解释概念,并辅以实例代码,帮助读者理解和掌握JavaScript的核心特性。 其次,“测试用例”是软件开发中的重要环节,它能确保代码的质量和功能的正确性。JavaScript的测试工具有很多,如...
本教程旨在深入浅出地介绍HTML5在移动开发中的应用,帮助学习者掌握相关技术并提升开发能力。 1. HTML5的基础结构与语法:HTML5引入了新的标签,如、、等,提高了文档结构的语义化。同时,移除了部分过时的元素,...
1. **Python基础知识**:Python作为爬虫开发的常用语言,首先你需要掌握其基本语法,包括变量、数据类型、控制结构(如if-else,for,while)、函数定义和调用、模块导入等。 2. **HTTP/HTTPS协议**:爬虫工作在Web...
Java是世界上最流行的编程语言之...这份笔记深入浅出地介绍了Java开发的基本概念和技术,对于初学者和有一定经验的开发者来说都是宝贵的资源。通过阅读和实践,你将能够全面掌握JavaSE,并能进一步探索Web开发的深度。
李兴华老师的Java SE 8笔记涵盖了这些核心概念,并深入浅出地讲解了如何在实际开发中运用它们。这份笔记不仅是初学者的良师,也是经验丰富的开发者巩固基础、提升技能的好助手。通过阅读和学习,我们可以更好地理解...
这份笔记以中文为载体,深入浅出地涵盖了PHP语言的核心概念、语法以及实际应用,旨在帮助PHP初学者或进阶者系统性地掌握这一流行的服务器端脚本语言。 首先,从基础部分开始,笔记详细讲解了PHP的安装配置,包括在...
这套笔记以其深入浅出的讲解方式,为Java学者提供了一个良好的学习路径。 首先,我们来看【1、JavaSE:Java入门.pdf】,这个部分通常会介绍Java的历史背景、安装配置JDK(Java Development Kit)、编写第一个Hello ...
总的来说,这份资料是一份宝贵的Java和JavaScript学习资源,无论你是初学者还是经验丰富的开发者,都能从中获益匪浅。通过深入学习和实践,你将能够掌握Java语言及其在Web开发中的应用,成为一名优秀的Java工程师。