`

JavaScript深入浅出学习笔记(一)—数据类型

阅读更多

一.六种数据类型

        五种原始类型: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,效果如下:

 

视频学习地址:http://www.imooc.com/learn/277

  • 大小: 17.3 KB
  • 大小: 15.4 KB
  • 大小: 25.4 KB
  • 大小: 19.7 KB
  • 大小: 10.5 KB
  • 大小: 2.4 KB
分享到:
评论
2 楼 bijian1013 2015-01-11  
chenyingna66 写道
[1,2]==[1,2]这个是不相等的,javascript中的任何两个对象都是不相等的,只有他们的引用是相等的


哦,谢谢!
你说的完全正确,new Object()!=new Object(),[1,2]!=[1,2]这些对象都是不相等的
1 楼 chenyingna66 2015-01-09  
[1,2]==[1,2]这个是不相等的,javascript中的任何两个对象都是不相等的,只有他们的引用是相等的

相关推荐

    深入浅出javascript(pdf)

    "深入浅出JavaScript"这本书显然旨在帮助读者全面理解这种强大的编程语言,包括其核心概念、语法以及实际应用。 JavaScript的基础部分涵盖变量、数据类型、控制流(如条件语句和循环)、函数等。变量是存储数据的...

    《李炎恢Javascript笔记》+源码

    《李炎恢Javascript笔记》是一本深入浅出的JavaScript学习资料,它涵盖了JavaScript的基础到实践应用的诸多方面。这本书的特点是将复杂的编程概念分解为易于理解的小知识点,并且提供了源码示例,使得读者能够更好地...

    大佬的前端学习笔记

    【标题】:“大佬的前端学习笔记”是一份深入浅出的前端开发资源,包含了Web开发中的核心语言和技术,如Node.js、JavaScript、Axios、jQuery和HTML。这份笔记旨在帮助开发者提升前端技能,掌握现代Web开发的最佳实践...

    张孝祥JAVASCRIPT笔记

    张孝祥是一位知名的编程教育者,他的JavaScript教程以其深入浅出的讲解方式深受广大程序员喜爱。他的笔记涵盖了JavaScript的核心概念、语法、数据类型、控制结构、函数、对象、数组、字符串、正则表达式、DOM操作、...

    2011韩顺平轻松搞定网页设计(html+css+js)之javascript现场授课笔记(完整版).doc

    JavaScript,简称为JS,是一种广泛应用于Web开发的轻量级脚本语言。...在网页设计中,JavaScript扮演着至关重要的角色,因为它允许开发者...韩顺平老师的课程提供了深入浅出的讲解,对于初学者来说是一份很好的学习资源。

    跟李彦恢学javascript 电子书和课堂笔记1-15章.rar

    这本书深入浅出地介绍了JavaScript的基础知识,帮助读者掌握这门强大的脚本语言。JavaScript是一种广泛应用于Web开发的编程语言,它在网页交互、动态效果以及前后端数据交换等方面发挥着重要作用。 本书涵盖了1-15...

    韩顺平html+css+javascript笔记完整版

    "韩顺平html+css+javascript笔记"是一套全面的前端学习资料,韩顺平是一位知名的编程教育专家,他的讲解通常深入浅出,适合初学者。笔记中可能涵盖了HTML的基本结构和语义化,CSS的选择器、布局和动画,以及...

    林信良学习笔记之-AjaxGossip

    林信良的学习笔记《AjaxGossip》深入浅出地介绍了Ajax的核心概念和技术细节,对于初学者来说是一份非常实用的教程。 **Ajax基础** 1. **XMLHttpRequest对象**:Ajax的核心是XMLHttpRequest对象,它允许JavaScript...

    2010年北风网CJ讲师JavaScript_Ajax_jQuery视频教程下载地址

    本教程由北风网知名讲师CJ主讲,旨在深入浅出地讲解这三门技术,帮助学习者掌握现代Web开发的核心技能。 首先,JavaScript 是一种轻量级的解释型编程语言,主要用于客户端的网页开发。它赋予了网页动态性,允许...

    JavaScript忍者秘籍(第2版)笔记、习题与解析

    《JavaScript忍者秘籍(第2版)》是JavaScript编程领域的一本经典之作,它深入浅出地介绍了JavaScript的核心概念和技术。这本书不仅包含了基础语法,还涵盖了高级特性,旨在帮助读者成为JavaScript的高手,即“忍者...

    2023年韩顺平javascript课堂实录笔记千万别错过好东西.doc

    韩顺平老师的2023年JavaScript课堂实录笔记深入浅出地介绍了JS的核心概念和应用。 首先,JavaScript在网页中的应用非常广泛,包括地图搜索、网页游戏、用户输入验证(如邮箱、数字、身份证、IP地址等)、股市数据...

    李炎恢js笔记

    这份笔记通过深入浅出的方式,系统地讲解了JavaScript从基础到高级的各个方面,无论你是初学者还是有经验的开发者,都能从中受益。通过阅读和实践,你将能够掌握JavaScript的核心技术和最佳实践,为在Web开发领域...

    JavaScript资料大集成包括实用教程测试用例各种树形结构和教学文档

    这样的教程通常会深入浅出地解释概念,并辅以实例代码,帮助读者理解和掌握JavaScript的核心特性。 其次,“测试用例”是软件开发中的重要环节,它能确保代码的质量和功能的正确性。JavaScript的测试工具有很多,如...

    html5在移动领域开发学习笔记(ppt版)

    本教程旨在深入浅出地介绍HTML5在移动开发中的应用,帮助学习者掌握相关技术并提升开发能力。 1. HTML5的基础结构与语法:HTML5引入了新的标签,如、、等,提高了文档结构的语义化。同时,移除了部分过时的元素,...

    自学Python爬虫路上的实战笔记,由浅到深逐步深入学习Python 爬虫.zip

    1. **Python基础知识**:Python作为爬虫开发的常用语言,首先你需要掌握其基本语法,包括变量、数据类型、控制结构(如if-else,for,while)、函数定义和调用、模块导入等。 2. **HTTP/HTTPS协议**:爬虫工作在Web...

    超详细java笔记

    Java是世界上最流行的编程语言之...这份笔记深入浅出地介绍了Java开发的基本概念和技术,对于初学者和有一定经验的开发者来说都是宝贵的资源。通过阅读和实践,你将能够全面掌握JavaSE,并能进一步探索Web开发的深度。

    李兴华javaSE8笔记Word版

    李兴华老师的Java SE 8笔记涵盖了这些核心概念,并深入浅出地讲解了如何在实际开发中运用它们。这份笔记不仅是初学者的良师,也是经验丰富的开发者巩固基础、提升技能的好助手。通过阅读和学习,我们可以更好地理解...

    韩顺平php全套视频教程笔记

    这份笔记以中文为载体,深入浅出地涵盖了PHP语言的核心概念、语法以及实际应用,旨在帮助PHP初学者或进阶者系统性地掌握这一流行的服务器端脚本语言。 首先,从基础部分开始,笔记详细讲解了PHP的安装配置,包括在...

    狂神说笔记,个人觉得不赖

    这套笔记以其深入浅出的讲解方式,为Java学者提供了一个良好的学习路径。 首先,我们来看【1、JavaSE:Java入门.pdf】,这个部分通常会介绍Java的历史背景、安装配置JDK(Java Development Kit)、编写第一个Hello ...

    狂神java全套PDF笔记涵盖java js javaweb sping spingmvc spingcloud

    总的来说,这份资料是一份宝贵的Java和JavaScript学习资源,无论你是初学者还是经验丰富的开发者,都能从中获益匪浅。通过深入学习和实践,你将能够掌握Java语言及其在Web开发中的应用,成为一名优秀的Java工程师。

Global site tag (gtag.js) - Google Analytics