进击JavaScript核心 --- (1)基本数据类型
ES5之前提供了 5种基本数据类型 和 1种引用数据类型
基本数据类型:Undefined, Null, String, Number, Boolean
引用数据类型:Object
ES6开始引入了一种新的基本数据类型 Symbol,表示独一无二的值
1、typeof 操作符
typeof 是一个操作符而不是函数,因此后面的圆括号可以用,但不是必须的
"undefined" --- 如果这个值未定义(注意:包括未声明和未初始化)
"string" --- 如果这个值是字符串
"number" --- 如果这个值是数值
"boolean" --- 如果这个值是布尔值
"object" --- 如果这个值是null 或 引用数据类型
"function" --- 如果这个值是函数(某些低版本浏览器对正则表达式也会返回function)
console.log(typeof a) // undefined (未定义的变量,使用typeof 操作符检测也会返回undefined)
console.log(typeof undefined) // undefined
console.log(typeof null) // object (null 被认为是一个空的对象引用)
console.log(typeof('string')) // string
console.log(typeof 3) // number
console.log(typeof true) // boolean
console.log(typeof function(){}) // function
console.log(typeof []) // object
console.log(typeof {}) // object
console.log(typeof /^\d/) // object
2、Undefined类型
Undefined类型只有一个特殊的值,即undefined。声明变量但未加以初始化时,该变量的值就是 undefined
未初始化和未声明是完全不同的,前者会被赋值为 undefined,后者会报错。但是使用 typeof 操作符检测时,两者都会返回 undefined
var a
console.log(a) // undefined (声明但未初始化)
console.log(b) // Uncaught ReferenceError: b is not defined (报错:b 未定义)
var a
console.log(typeof a) // undefined
console.log(typeof b) // undefined
3、Null 类型
Null 类型也只有一个特殊的值 null,null值表示一个空对象指针
使用 typeof 操作符检测 null 值时会返回 "object"
var a = null
console.log(typeof a) // object
null 和 undefined 之间的关系:
(1)、undefined 值派生自 null 值,所以二者相比较(==)总是返回true
console.log(undefined == null) // true
console.log(undefined === null) // false
(2)、无论何时,都没有必要显示的为一个变量赋值为 undefined
(3)、如果一个变量用于在将来保存对象,则可以将其初始化为 null
4、String 类型
字符串是不可变的,一旦创建,值就不能改变。如要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用新字符串来填充该变量
var str = "java"
str = "javascript" // 销毁掉原来的字符串,再用新字符串填充变量 str
toString()方法 和 String()方法的区别:
(1)、toString()方法适用于 String, Number, Boolean, Object,不可用于 Null 和 Undefined;String()方法则可以用于所有的
var num = 1, bool = true
alert(num.toString()) // '1'
alert(bool.toString()) // 'true'
alert(null.toString()) // Uncaught TypeError: Cannot read property 'toString' of null
alert(undefined.toString()) // string.js:14 Uncaught TypeError: Cannot read property 'toString' of undefined alert(String(num)) // '1'
alert(String(bool)) // 'true'
alert(String(null)) // 'null'
alert(String(undefined)) // 'undefined'
(2)、toString()方法内部可以通过传递基数,输出二进制、八进制、十进制、十六进制的字符串值,默认是十进制
var num = 10
alert('不传基数,默认是十进制:' + num.toString()) // 不传基数,默认是十进制:'10'
alert('二进制基数:' + num.toString(2)) // 二进制基数:'1010'
alert('八进制基数:' + num.toString(8)) // 八进制基数:'12'
alert('十六进制基数:' + num.toString(16)) // 十六进制基数:'a'
字符串数值做加法运算 "+" 会拼接成新的字符串,其余的 "-", "*", "/", "%" 均会自动转成 Number类型,再计算
var num1 = '11', num2 = '2', num3 = 3 alert(num1 + num2 + num3) // '1123'
alert(num1 - num2) //
alert(num1 + num2 - num3) //
alert(num1 * num2 * num3) //
alert(num1 / num2 / num3) // 1.8333333333333333
alert(num1 % num2 % num3) //
5、Number 类型
浮点数值
(1)、由于保存浮点数值需要的内存空间是保存整数值的两倍,js引擎会不失时机的将浮点数值转为整数值
var num1 = 10.0 // 解析为10
(2)、浮点数的小数点前面可以没有整数,但不推荐这种写法
var num1 = 0.3
var num2 = .2 // 不推荐
(3)、js引擎会将小数点后面带有6个零以上的浮点数转为科学计数法表示的值,例如:0.0000003 会被转换成 3e-7
(4)、由于浮点数计算存在误差,因此,永远不要测试某个特定的浮点数值
console.log(0.1 + 0.2) // 0.30000000000000004
if(0.1 + 0.2 == 0.3) { // 不要做这样的测试
alert('0.1 加 0.2 等于 0.3')
} else{
alert('0.1 加 0.2 不等于 0.3')
}
// 0.1 加 0.2 不等于 0.3
NaN 非数值(Not a Number),是一个特殊的数值,如果操作两个数值,但是不能正确返回数值,就会返回NaN(这样就可以避免报错)
alert(0 / 0) // NaN
alert(8 / 0) // Infinity
alert(-2 / 0) // -Infinity
NaN的两个特点:
(1)、任何涉及NaN的操作,都会返回NaN
alert(NaN / 0) // NaN
alert(NaN + '1') // NaN1 (涉及字符串拼接的除外)
alert(NaN + 1) // NaN
alert(NaN * 1) // NaN
(2)、NaN不大于,不小于,不等于任何数,包括NaN
alert(NaN > 3) // false
alert(NaN < 0) // false
alert(NaN == 0) // false
alert(NaN == NaN) // false
alert(NaN > NaN) // false
alert(NaN < NaN) // false
isNaN() 函数接受一个参数,该参数可以是任意类型,如果该参数可以转为数值,则返回false;如不能转为数值,则是一个NaN,返回true
alert(isNaN(10)) // false (10本来就是一个数字)
alert(isNaN('10')) // false (字符串10可以转为数字10)
alert(isNaN('10str')) // true
alert(isNaN('str')) // true
alert(isNaN(true)) // false (可以转为数字1)
alert(isNaN(NaN)) // true
alert(isNaN({age: 3})) // true (先调用对象的valueOf() 方法,若返回数字则为false,反之为true)
在基于对象调用 isNaN() 方法时,会首先调用 valueOf() 方法,如果返回值不可以转为数字,则基于这个返回值调用 toString() 方法,再测试返回值
var obj1 = {
name: 'Jim',
age: 3,
valueOf: function() { // 返回一个数字
return this.age
}
}
var obj2 = {
name: 'Jim',
age: 3,
valueOf: function() { // 返回一个字符串
return this.name
}
}
var obj3 = {
name: 'Jim',
age: 3,
score: {
chinese: 96,
math: 99,
toString: function() {
return 99
}
},
valueOf: function() { // 返回一个对象
return this.score
}
} alert(isNaN(obj1)) // false (重写了 valueOf() 方法,返回一个数字3)
alert(isNaN(obj2)) // true (valueOf() 方法返回一个字符串 'Jim',这个字符串不能被转为数字)
alert(isNaN(obj3)) // true (valueOf() 方法返回了一个对象,尽管该对象重写了 toString()方法,但是并没有执行,此处不解 ~~~)
数值转换, 一共提供了三个转型函数:
Number():用于任何数据类型
parseInt(), parseFloat():专门用于把字符串转为数值
Number() 转换规则:
(1)、Boolean类型的值,true 和 false 分别被转为1 和 0
(2)、null 值返回 0, undefined 返回 NaN
(3)、字符串类型分为以下几种情况:
如果字符串中只包含数字,则将其转为十进制数值(前导的0会被忽略)
如果字符串中包含有效的浮点数,则将其转为对应的浮点数值(前导的0会被忽略)
如果字符串中包含有效的十六进制数,则将其转为对应的十进制数
如果是空字符串,则将其转为0
除了以上情况之外的字符,一律转为NaN
alert(Number(true)) //
alert(Number(null)) //
alert(Number(undefined)) // NaN
alert(Number('32')) //
alert(Number('000011')) //
alert(Number('-3')) // -3
alert(Number('3.14')) // 3.14
alert(Number('0.1')) // 0.1
alert(Number('.1')) // 0.1
alert(Number('0xf')) //
alert(Number('')) //
alert(Number('{}')) // NaN
parseInt() 转换规则:
(1)、忽略字符串前面的空格,直至找到第一个非空格字符(如果第一个字符不是数字或者负号,则转为NaN;不同于Number(),空字符串也转为NaN)
(2)、如果找到的第一个有效字符是数字,则会依次解析后面的字符,直至结束或遇到非字符
(3)、不同于Number()将所有进制转为十进制,parseInt()可以正确解析八进制和十六进制数据
alert(parseInt(null)) // NaN
alert(parseInt(undefined)) // NaN
alert(parseInt('blue123')) // NaN
alert(parseInt('123blue')) //
alert(parseInt('string')) // NaN
alert(parseInt(true)) // NaN
alert(parseInt(3.14)) //
alert(parseInt(.1)) //
alert(parseInt('070')) // 70 (ECMAScript 3 认为是 56(八进制),ECMAScript 5 认为是 70(十进制))
alert(parseInt('70')) //
alert(parseInt('0xf')) //
alert(parseInt('0xAF')) //
鉴于上面处理八进制数时的困惑,parseInt() 函数提供了第二个参数,转换时的基数(不填则默认是10)。
alert(parseInt('070', 8)) //
alert(parseInt('070')) //
alert(parseInt('AF', 16)) //
alert(parseInt('AF')) // NaN
parseFloat() 转换规则:
(1)、字符串中第一个小数点是有效地,第二个小数点是无效的,因此后面的字符串将会被忽略
(2)、只解析十进制的数,没有第二个参数。因此,十六进制的数始终被转换为0
(3)、如果字符串解析后是一个整数,或者小数点后面都是0,则被转换为一个整数
alert(parseFloat('3.14')) // 3.14
alert(parseFloat('.1')) // 0.1
alert(parseFloat('0.66')) // 0.66
alert(parseFloat('0.6.3')) // 0.6
alert(parseFloat('AF')) // NaN
alert(parseFloat('070')) //
alert(parseFloat('0xf')) //
alert(parseFloat('3.0000')) //
alert(parseFloat('00011')) //
alert(parseFloat('123blue')) //
6、Boolean 类型
Boolean() 转换规则:
(1)、String类型:任何非空字符串都转为true,空字符串转为false
(2)、Number类型:任何非零数值(包括Inifity)都转为true,0 和 NaN 转为false
(3)、Object类型:任何对象都转为true,null 转为false
(4)、Undefined类型:转为false
alert(Boolean('true')) // true
alert(Boolean('false')) // true
alert(Boolean('')) // false
alert(Boolean(25)) // true
alert(Boolean(-0.1)) // true
alert(Boolean(Infinity)) // true
alert(Boolean(0)) // false
alert(Boolean(NaN)) // false
alert(Boolean({})) // true
alert(Boolean([])) // true
alert(Boolean(null)) // false
alert(Boolean(undefined)) // false
7、相等操作符
相等和不想等:自动隐式转换,先转换再比较
规则:
(1)、如果有一个操作数是布尔值,则在比较之前先将其转为数值,false 转为 0,true 转为 1
(2)、如果有一个操作数是字符串,另一个操作数是数值,则在比较之前先将字符串转为数
(3)、如果有一个操作是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则比较
(4)、如果两个操作数都是对象,则比较它们是不是同一个对象。如果都指向同一个对象,则返回true,否则,返回false
alert(true == 1) // true
alert(true == 2) // false
alert(false == 0) // true
alert(false == []) // true
alert(0 == '') // true
alert('5' == 5) // true
alert('blue' == true) // false ('blue'转为数值是NaN)
alert('blue' == 1) // false
alert(null == undefined) // true
alert(undefined == 0) // false
alert(undefined == false) // false
alert(null == false) // false
alert(undefined == undefined) // true
alert(null == null) // true
alert(undefined == []) // false
alert(NaN == NaN) // false
alert(NaN != NaN) // true
alert([] != []) // true
alert({age: 3} == 3) // false
alert({age: 3, valueOf: function(){return this.age}} == 3) // true
全等和不全等:仅比较不转换
alert(5 === '5') // false (不同数据类型,不相等)
alert(null === undefined) // false (二者是类似的值,但是不同类型的值)
进击JavaScript核心 --- (1)基本数据类型的更多相关文章
- 进击JavaScript核心 --- (2)函数和预解析机制
一.函数 每个函数都是 Function类型的实例,也具有属性和方法.由于函数也是一个对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 1.函数的定义方式 (1).函数声明 fun ...
- 进击JavaScript核心 --- (3)面向对象
JS中的对象定义为:无序属性的结合,其属性可以包含基本值.对象或者函数 1.定义对象的方式 (1).Object构造函数 var student = new Object(); student ...
- javascript 核心语言笔记- 3 - 类型、值和变量
JavaScript 中的数据类型分为两类:原始类型(primitive type)和对象类型(object type).原始类型包括数字.字符串和布尔值 JavaScript 中有两个特殊的原始值: ...
- JavaScript编程:javaScript核心基础语法
1.javaScript核心基础语法: javaScript技术体系包含了5个内容: 1.核心语言定义: 2.原生对象和雷子对象: 3.浏览器对象 ...
- JavaScript学习10 JS数据类型、强制类型转换和对象属性
JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】
原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...
- JavaScript 核心参考教程 内置对象
这个标准基于 JavaScript (Netscape) 和 JScript (Microsoft).Netscape (Navigator 2.0) 的 Brendan Eich 发明了这门语言,从 ...
- Javascript核心概述 - 深入了解javascript
/* 一.执行上下文:堆栈(底部全局上下文+顶部当前活动上下文) */ /* 二.变量对象: 变量根据执行上下文,找到数据存储位置,这种机制叫变量对象 1. 变量都要var定义,且都不能delete ...
- 《JavaScript核心概念》基础部分重点摘录
注:<JavaScript核心概念>适合深入了解JavaScript,比我买的<JavaScript框架设计>语言和内容丰富多了(可能是我水平尚浅吧). 1. 作用域 var ...
随机推荐
- NPM 与 Nodejs
安装了Nodejs之后,NPM也安装好了 如何知道当前是否已经安装Nodejs和NPM了呢? node -v //查看当前nodejs的版本 npm -v //查看当前npm的版本 NPM 初始化 n ...
- CodeForces - 922E Birds —— DP
题目链接:https://vjudge.net/problem/CodeForces-922E E. Birds time limit per test 1 second memory limit p ...
- cmd 环境变量设置方法详细解释
cmd设置环境变量可以方便我们bat脚本的运行,但是要注意的是变量只在当前的cmd窗口有作用(局部生效),如果想要设置持久的环境变量需要我们通过两种手段进行设置:一种是直接修改注册表,另一种是通过我的 ...
- 51nod 1533 && CF538F
题目:难以简述,请传送门 神犇题解Ⅰ 神犇题解Ⅱ 好劲啊跪在地上..完全没接触过K叉树的性质.. 对于每个询问,我们并不关心叶节点,只关心其他的节点.而一个完整K叉树的内节点个数是O(n/k)的, ...
- str_2.判断两个字符串是否互为旋转词
1. 字符串str的前面任意部分挪到后面形成的字符串叫做字符串str的旋转词 $str1 = "2ab1"; $str2 = "ab12"; $ret = is ...
- TCP协议与流通信
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! TCP(Transportation Control Protocol)协议与IP ...
- Java与国际化
i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是"国际化"的简称. Java使用java.util.ResourceBu ...
- BZOJ1251 序列终结者(Splay平衡树)(占位)
网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量…… ...
- Qt之log数据展示模块简要实现
Log模块主要用于实时测井数据的显示和测后曲线数据的预览和打印,为更好的展示对Qt中相关知识点的应用,特以Log模块为例对其进行简要实现. 内容导图: 一.功能需求 1.界面效果图 Log模块实现曲线 ...
- 一:AMQP协议标准简单介绍
一:AMQP协议?--->AMQP 是 Advanced Message Queuing Protocol,即高级消息队列协议.和前面罗列的技术不同,AMQP 是一个标准化的消息中间件协议--- ...