JavaScript 的数据类型 相关知识点
(1)基本数据类型介绍
JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type)
或者说是:可以拥有方法的类型和不能拥有方法的类型
或者说是:可变(mutable)类型和不可变(immutable)类型
原始类型主要包括:数字(number)、字符串(string)、布尔值(boolean)、undefined (一般来说 未定义的值和定义未赋值的为undefined )
其中NaN属于一种特殊的number
对象类型说白了数据类型就是:对象(object)
其中 null 属于一种特殊的object
对象(object)是属性(property)的集合,基本上每个属性都由 key/value 构成
其中,类可以看做是对象类型的子类型,主要有:数组(Array)、函数(Function)、日期(Date)、正则(RegExp)、错误(Error)类
看代码:
var a1;
var a2 = true;
var a3 = 1;
var a4 = "Hello";
var a5 = new Object();
var a6 = null;
var a7 = NaN;
var a8 = undefined;
alert(typeof a); //显示"undefined"
alert(typeof a1); //显示"undefined"
alert(typeof a2); //显示"boolean"
alert(typeof a3); //显示"number"
alert(typeof a4); //显示"string"
alert(typeof a5); //显示"object"
alert(typeof a6); //显示"object"
alert(typeof a7); //显示"number"
alert(typeof a8); //显示"undefined"
通过简单的比较可以发现,null和undefined值相等,但不全等;
NaN与任何值都不相等,包括自己。如果要判断变量x是否是NaN,通过方法x==NaN 行不通,应该使用x!=x 判断,当然了,也可以使用函数isNaN(x)判断
函数isNaN() 如果参数是NaN或者是一个非数字值(比如字符串或对象),则返回true
另外Infinity表示无穷大,有相应函数判断 isFinite(),参数如果不是NaN、Infinity、或-Infinity的时候返回true
负零值是特殊的,和正零值是相等的,但作为除数时就不一样了:
var zero = 0; //正
var negz = -0; //负
console.log(zero === negz); //true
console.log(1/zero === 1/negz); //false
另外,JavaScript是属于使用二进制浮点数的编程语言,所以计算浮点数的时候可能会出现问题,应该避免:比如
var z = .4 - .3;
console.log(z); // 0.10000000000000003
var x = .3 - .2;
console.log(x); // 0.09999999999999998
var y = .2 - .1;
console.log(y); // 0.1
简单比较
var a1; //a1的值为undefined
var a2 = null;
var a3 = NaN;
alert(a1 == a2); //显示"true"
alert(a1 != a2); //显示"false"
alert(a1 === a2); //显示"false"
alert(a1 == a3); //显示"false"
alert(a1 != a3); //显示"true"
alert(a2 == a3); //显示"false"
alert(a2 != a3); //显示"true"
alert(a3 == a3); //显示"false"
alert(a3 != a3); //显示"true"
可以拥有方法:就是说可以拥有方法的类型,比如一个数组具有排序的方法:arr.sort()
一般来说,对象、数字、字符串、布尔值都可以拥有方法
不能拥有方法:null undefined之类
可变类型:就是说值是可以修改的,比如一个数组,或者说一个对象,JavaScript程序可以更改对象属性值和数组元素的值。
var o = { x: 1};
o.x = 2; //change
o.y = 3; //add
不可变类型:数字、字符串、布尔值、null、undefined 之类就属于不可变的
比如说字符串是不可变类型:(一般来说是返回一个新值,而原来的值不变)
var str = "you";
console.log(str.toUpperCase()); //YOU
console.log(str); //you
而JavaScript变量是属于无类型(untyped),就是说变量可以赋予不同类型的值。
全局属性有哪些?比如undefined、Infinity、NaN
全局函数有哪些?比如isNaN()、parseInt()、eval()
全局对象有哪些?比如Math、JSON
构造函数有哪些?比如Date()、RegExp()、String()、Object()、Array()
(2)null和undefined的区别
console.log(Number(null)); // null转换为0
console.log(5+null); //
console.log(Number(undefined)); //undefined转换为NaN
console.log(5+undefined); //NaN
console.log(null == undefined); //true
console.log(null === undefined); //false
null 表示 没有对象,此处不应有值 典型的用法有:
1.作为函数的参数,表示该函数的参数不是对象
2.作为对象原型链的终点
比如:
Object.getPrototypeOf(Object.prototype); //null
undefined表示 缺少值,本处应该有一个值,但是还没有定义 典型的用法有:
1.变量被声明了,但还没有赋值时,就等于undefined
2.调用函数时,应该提供的参数没有提供,该参数就等于undefined
3.对象没有赋值的属性,该属性的值就为undefined
4.函数没有返回值时,默认返回undefined
比如:
var i;
i // undefined function f(x){console.log(x)}
f() // undefined var o = new Object();
o.p // undefined var x = f();
x // undefined
(3)数据类型转换
JavaScript取值类型非常灵活,类型的转换也非常灵活,要掌握好,也不是说很容易的
(此部分摘自:http://www.cnblogs.com/2050/archive/2012/08/17/2644189.html )
1)转换成布尔值
程序在 if 语句 以及 ||、&&、! 等逻辑判断的环境下会把表达式自动转换成布尔值。
想要手动转换某个东西为布尔值有两种方法:
(1)、使用 !! ; 比如 console.log(!!30); //true
(2)、使用 Boolean(),记住前面不要加new; 比如console.log(Boolean(30)); //true
1、数字转换成布尔值
除了0和NaN 被转换成false外,所有自他数字都会被转换成true
2、字符串转换成布尔值
这个更简单,除了空字符串被转换成false外,所有字符串都会被转换成true
3、其他类型转换成布尔值
undefined和null会被转换成false, 任何对象(包括数组)和函数都会被转换成true,记住,是任何
var o = new Boolean(false);
alert(o);//转换成字符串,结果是false
alert(!!o); //转换成布尔值,结果是 true
2)转换成字符串
把某一个东西强制转换成字符串有两种方法:
'' + x //方法一,用一个空字符串与之相加
String(x) //方法二,使用不带new的字符串构造函数
1、数字转换成字符串
这个没什么要说的,数字都是按原样转换成字符串,但用科学计数法表示的数字(也就是带e的)会转换成它内部代表的真实的数字的字符串。
还需要注意的是,当使用二元的加号运算符时,如果两个运算数中有一个不是数字,则会进行字符串的连接操作,而不是数学加法操作,两个运算数都会被转换成字符串。当null与数字相加时,不会进行字符串连接,而是会把null转换成0来进行数学元素。
[]+1+3 //结果为13
[1]+3 //结果为13
null+1+3 //结果为4
2、其他类型转换成字符串
当对象或函数转换成字符串时,会调用它们的 toString() 方法来进行转换,默认的是 Object.prototype.toString 和
Function.prototype.toString,但它们是可以被我们自定义的toString方法覆盖的。当把一个函数转换成一个字符串时,不
一定就要显示函数的源代码,Function.prototype.toString 方法的结果依赖于它的环境是怎么实现它的。
3)转换成数字
除了加号以外的其他数学运算符,都会进行转换为数字的操作。把一个东西强制转换成数字也有两种方法:
+x //使用一个一元的加号运算符,这是最快的方法
x-0 或 x*1 //另一种形式
Number(x) //使用不带new的数字构造函数进行转换
1、字符串转换成数字
除了空字符串会被转换成0以外,如果字符串中是正确的数字书写形式,那么都可以顺利转换成相应的数字,不管是小数、科学计数还是八进制、十六进制形式等。但是如果参杂了其他不能构成数字或不符合数字书写规则的东西,则会被转换成NaN。
NaN是指不是数字的意思,任何数字数字跟NaN进行运算得到的结果都是NaN,NaN甚至跟自己也不相等。
2、其它类型转换成数字
对象和函数总是被转换成NaN, undefined也会被转换成NaN, 但null会被转换成0
上面的表遗漏了数组的情况。数组会首先被转换成字符串,然后再转换成数字。
alert(+[]); //结果为0
alert(+[1]); //结果为1
alert(+[1,2]); //结果为NaN
alert(+new Array(1)); //结果为0
alert(+new Array(1,2)); //结果为NaN
3、数字转换函数
parseInt 比如
console.log(parseInt("123one")); //
console.log(parseInt("one123")); //NaN
parseFloat
附表(权威指南)
JavaScript 的数据类型 相关知识点的更多相关文章
- java的数据类型相关知识点
总结就是八个字: 数据2型,四类八种 (个人理解,仅供参考) 解析图如下: 基本数据类型: 1.逻辑类:boolean 布尔类型,它比较特殊,布尔类型只允许存储true(真)或者false(假),不可 ...
- javascript 概述及基础知识点(变量,常量,运算符,数据类型)
JavaScript概述 1.1 什么是JavaScript: javaScript(简称js),是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言.同时也是一种广泛用于客户端Web开发的脚本语 ...
- JS面试题-<变量和类型>-JavaScript的数据类型
前言 整理以前的面试题,发现问js数据类型的频率挺高的,回忆当初自己的答案,就是简简单单的把几个类型名称罗列了出来,便没有了任何下文.其实这一个知识点下可以牵涉发散出很多的知识点,如果一个面试者只是罗 ...
- IOS开发涉及有点概念&相关知识点
前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...
- java相关知识点
Java基础.语法 1. 简述Java跨平台原理 2. Java的安全性 3. Java三大版本 4. 什么是JVM?什么是JDK? 什么是JRE? 5. Java三种注释类型 6. 8种基本数据类型 ...
- web前端(14)—— JavaScript的数据类型,语法规范1
编辑器选择 对js的编辑器选用,有很多,能对html编辑的,也能对js编辑,比如notepad++,visual studio code,webstom,atom,pycharm,sublime te ...
- http及浏览器相关知识点归纳
http是应用层协议,采用请求/响应模型 1.浏览器地址栏输入URL地址后发生了什么? 浏览器判断地址是否是合理的URL地址,是否是http协议请求,如果是则进入下一步 浏览器对此URL进行缓存检查: ...
- 前端面试的那些事儿(1)~JavaScript 原始数据类型
前言 自我总结面试常问的一些细节,方便不断回顾与补充.第一次发表文章,如有问题或不足之处望及时指出. JavaScript 原始数据类型 1.1 基础数据类型 7大基础数据类型 boolean nul ...
- sql注入原理+mysql相关知识点
什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...
随机推荐
- Openresty 安装教程
Openresty的简单安装方法,如需高级编译安装,请参照安装选项 1.安装配置好Yum源,不赘述此步骤 2.安装必要组件 yum install pcre-devel openssl-devel g ...
- TaskHosting - 开发桌面工具原来还可以这么简单
由来 对于喜欢开发的我经常会写一些小工具,这些小工具多以功能为主,不要求漂亮.个性化的UI.但起码要保证使用方便,因此最基本的功能要有: GUI(图片用户界面) 程序配置的保存与读取(让用户在GUI上 ...
- WebSocket桌面客户端工具
考虑到WebSocket的诸多优点和未来的趋势,去年底把服务端通讯全部由HTTP改成WebSocket,期间为了方便测试,做了这个小工具.共享出来以方便有同样需求的程序员. 下载的压缩包里含有源代码和 ...
- 前端开发者进阶之ECMAScript新特性【一】--Object.create
Object.create(prototype, descriptors) :创建一个具有指定原型且可选择性地包含指定属性的对象 参数:prototype 必需. 要用作原型的对象. 可以为 nul ...
- C#记录对象的变化
经常,我们会遇到一个场景,在保存对象到数据库之前,对比内存对象和数据库值的差异. 下面我写了一种实现,为保存定义一个事件,然后自动找出对象之间的差异,请注意,并没有通过反射的方式去获取每个属性及其值. ...
- 学习之路三十八:Hook(钩子)的学习
好久没写文章了,还记得年前面试了一家公司,为了检测一下我的学习能力,给了我一个任务,做一个自动登录并自动操作菜单的程序. 花了几天的时间研究了Hook以及使用WindowsAPI操作程序的知识,现在记 ...
- C代码中如何调用C++ C++中如何调用C
注意这里的C调用C++或者C++调用C意思是.c文件中调用.cpp文件中代码,或者相反. 集成开发环境如VC++6.0或者vs都是以文件后缀来区别当前要编译的是C代码还是C++代码,然后采用响应的编译 ...
- swift 闭包
闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着 这些常量和变量,俗称闭包. Swift标准库中提供了sort排序函数,sort函数的第二个参数是个闭包.和OC中的bl ...
- C# 调用 WebService 连接ORACLE 11g
这几天开发一个WebService遇到很多问题,记录下来顺便帮助一下以后遇到情况的人. 我是通过ADO.NET来连接ORACLE的,也可以用ORACLE提供的ODP.NET. 通过正常的连接后部署II ...
- uniGUI试用笔记(十五)通过URL控制参数
通过URL代入参数,在代码中读取,如: http://localhost:8501/?ServerPort=212&&ServerIP=192.168.31.12 在代码中可以通过: ...