陪你读书-JS-第十期总结
1.JS中数据类型
基础数据类型:string、number、boolean、undefined、null
复杂数据类型:object
2.三个开发上的建议
- 当你需要新建一个变量并且需要赋值,或者新建一个对象需要为对象的属性赋值时,可以用null
- 但判断一个函数的某一个参数是否传入的时候通常使用
=== 'undefined'
进行判断 - 检测某一个值是否存在或者是否为null用
=== null
进行判断
3.只有6个值在进行bool类型转换的时候可以转换为false
这6个值为:undefined、null、 +0、-0、’’、NaN 空数据和{}为true
Boolean(undefined) // false
Boolean(null) // false
Boolean(+0) // false
Boolean(-0) // false
Boolean('') // false
Boolean(NaN) // false
Boolean({}) // true
4.数值类型:常规的数字,无穷,NaN
- 小数:
0.1 + 0.2 != 0.3
原因为js表示数字时是用二进制表示数字的,可以这样计算:0.1x10 + 0.2x10 = 3 3/10 =0.3
- NaN: not a number 是一个不等于任何数字的数字类型,
typeof(NaN)= “number”
,NaN !== NaN
,它是唯一一个不等于它本身的数字 - 字符串:本质是一个unicode编码的序列,length属性返回的是unicode编码的长度,一个汉字返回的长度是1
- 理论上只有对象(Object)可以使用属性和方法的引用,字符串引用方法时,会先判断表达式是不是对象,若不是对象,就会直接报错,在所有的基本类型中,只有
null
和undefined
不能转换为对象(Object) - 复杂数据类型:object,是由属性和属性的值所组成的无序列表的合集
5.对象和原始类型的区别
- 对象有属性
- 对象有方法:方法本身是一种特殊的方法
- 对象是可以改变的
6.对象的分类
- 常用对象:String,Boolean,正则表达式,Object,Number,Function,Array,Date
- 内置对象:Global,Math,Json 与其他对象的区别就是,如果使用内置对象的时候是不需要用new操作符的,可以直接使用
- 数组对象:Windows,和JS本身运行环境有关系的
- 自定义对象:
7.基础数据类型和对象的转化
- 原始类型<->原始类型(相互转换)
(1)原始类型<->字符串,直接加俩""
(2) 原始类型<->数字Boolean -> string :"true" or "false", Number -> String: 10.toString() = 10(默认以十进制为基) 基模式:10.toString(2) = 1010, 10.toString(8) = 12, 10.toString(16) = A
ECMAScript 提供了两种把非数字的原始值转换成数字的方法,即Number(undefined) // NaN Number(null) // 0 Number(true) // 1 Number(false) // 0 Number('123') // 123 Number('1abc) // NaN Number('') // 0
parseInt()
和parseFloat()
。
正如您可能想到的,前者把值转换成整数,后者把值转换成浮点数。只有对String
类型调用这些方法,它们才能正确运行;对其他类型返回的都是 NaN。
parseInt(12345red) = 12345
,parseInt(“AF”, 16) = 175 // (基模式)
parseFloat()
只能是十进制,不能有基模式,
第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的。parseFloat()
会把这个小数点之前的字符转换成数字。这意味着字符串"11.22.33"
将被解析成11.22
。
使用parseFloat()
方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,而不是用八进制或十六进制。该方法会忽略前导 0,所以八进制数 0102 将被解析为 102。对于十六进制数 0xA,该方法将返回 NaN,因为在浮点数中,x 不是有效字符。(注释:经测试,具体的浏览器实现会返回 0,而不是 NaN。)
(3) 原始类型<->bool
只有6个值在进行bool类型转换的时候可以转换为false
这6个值为:undefined、null、 +0、-0、’’、NaN 空数据和{}为true
(4)强制类型转换Boolean(undefined) // false Boolean(null) // false Boolean(+0) // false Boolean(-0) // false Boolean('') // false Boolean(NaN) // false Boolean({}) // true
您还可以使用强制类型转换(type casting)来处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
编者注:cast 有“铸造”之意,很贴合“强制转换”的意思。
ECMAScript 中可用的 3 种强制类型转换如下:- Boolean(value) - 把给定的值转换成 Boolean 型;
- Number(value) - 把给定的值转换成数字(可以是整数或浮点数);
- String(value) - 把给定的值转换成字符串;强制转换成字符串和调用 toString() 方法的唯一不同之处在于,对
null
和undefined
值强制类型转换可以生成字符串而不引发错误:
用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。var s1 = String(null); //"null" var oNull = null; var s2 = oNull.toString(); //会引发错误
Number()
函数的强制类型转换与parseInt()
和parseFloat()
方法的处理方式相似,只是它转换的是整个值,而不是部分值。
parseInt()
和parseFloat()
方法只转换第一个无效字符之前的字符串,因此"1.2.3"
将分别被转换为1
和1.2
。
用Number()
进行强制类型转换,"1.2.3"
将返回NaN
,因为整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number()
将判断是调用parseInt()
方法还是parseFloat()
方法。 - 原始类型<->对象
PS:只有null和undefined不能转换为对象(Object)
数字和bool->对象:l转换为object时为一个对象,对象的名字叫原始值Object (true) = [Boolean: true] Object (3) = [Number: 3]
字符串->对象 Object ('abc') = [String: 'abc']
对象->boolean 均为true
对象->字符串 先toString
后valueOf
,若valueOf
后返回结果是原始类型则result->字符串的转换,
对象->数字,先valueOf
后toString
,若valueOf
后返回结果是原始类型,则直接返回回来,若还是object,则再调用toString
,若返回结果result是原始类型,则result->数字的转换,若不是,则报错(Number([])=0,Number({})=NaN)
PS:toString()
是可以接收参数的,表示的是几进制的数,范围为2-36,Math.random().toString(36)
生成序列书
8.变量定义
使用var: 局部变量(作用于是当前的函数),创建的变量不可删除,变量会被提前
不使用var: 全局变量,创建的变量可以删除(windows上面的一个属性),变量不会被提前
9.一元操作符:很高的优先级,仅在. , () []之后
(1)、+、-、前++、后++、前–、后–、!、typeof、void、delete,typeof后面的括号()最好写上,!转换成布尔值;
Boolean(3) == !!(3) // true
String(3) == 3 + '' // true
+'123' == Number(123) // true
delete 运算符删除对以前定义的对象属性或方法的引用。例如:
var o = new Object;
o.name = "David";
alert(o.name); //输出 "David"
delete o.name;
alert(o.name); //输出 "undefined"
在这个例子中,删除了 name 属性,意味着强制解除对它的引用,将其设置为 undefined(即创建的未初始化的变量的值)。
delete 运算符不能删除开发者未定义的属性和方法。例如,下面的代码将引发错误:
delete o.toString;
即使 toString
是有效的方法名,这行代码也会引发错误,因为 toString()
方法是原始的 ECMAScript 方法,不是开发者定义的。
一元加法和一元减法
尽管一元加法对数字无作用,但对字符串却有有趣的效果,会把字符串转换成数字。
var sNum = "20";
alert(typeof sNum); //输出 "string"
var iNum = +sNum;
alert(typeof iNum); //输出 "number"
(2)、位运算 NOT
位运算 NOT 由否定号(~)表示,它是 ECMAScript 中为数不多的与二进制算术有关的运算符之一。位运算 NOT 实质上是对数字求负,然后减 1,
(3)、逻辑 NOT(!)逻辑 NOT 运算符返回的一定是 Boolean 值。
逻辑 NOT 运算符的行为如下:
- 如果运算数是对象,返回 false
- 如果运算数是数字 0,返回 true
- 如果运算数是 0 以外的任何数字,返回 false
- 如果运算数是 null,返回 true
- 如果运算数是 NaN,返回 true
- 如果运算数是 undefined,返回 true
!{} // false
!0 // true
!3 // false
!null // true
!NaN // true
!undefined // true
10.二元操作符
&& 、||、+、-、x、/
1.加法运算符
与乘性运算符一样,在处理特殊值时,ECMAScript 中的加法也有一些特殊行为:
1 + NaN = NaN
-Infinity + -Infinity = Infinity
Infinity + -Infinity = NaN
+0 + +0 = +0
-0 + +0 = +0
-0 + -0 = -0
undefined + true = NaN
null + false = 0
1 + false = 1
1 + true = 2
{name: '张三'} + {age: 24} = [object Object][object Object]
不过,如果某个运算数是字符串,那么采用下列规则:
- 如果两个运算数都是字符串,把第二个字符串连接到第一个上。
'hello' + 'word' // helloword
- 如果只有一个运算数是字符串,把另一个运算数转换成字符串,结果是两个字符串连接成的字符串。
'hello' + 123 // hello123
- 注意:为了避免 JavaScript 中的一种常见错误,在使用加法运算符时,一定要仔细检查运算数的数据类型。
2.减法运算符
在处理特殊值时,减法运算符也有一些特殊行为:
console.log(1 - NaN) // NaN
console.log( Infinity - Infinity) // NaN
console.log( -Infinity - -Infinity) // NaN
console.log( Infinity - -Infinity) // Infinity
console.log( -Infinity - Infinity) // -Infinity
console.log(+0 - +0) // +0
console.log(-0 - -0) // -0
console.log(+0 - -0) // +0
console.log('hello' - 12) // NaN(某个运算符不是数字,也不能强制转化为数字)
3.逻辑 AND 运算符( && ),
逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。
如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值:
- 如果一个运算数是对象,另一个是 Boolean 值,返回该对象。
- 如果两个运算数都是对象,返回第二个对象。
- 如果某个运算数是 null,返回 null。
- 如果某个运算数是 NaN,返回 NaN。
- 如果某个运算数是 undefined,返回undefined 。
4.逻辑 OR 运算符( || )
与逻辑 AND 运算符相似,如果某个运算数不是 Boolean 值,逻辑 OR 运算并不一定返回 Boolean 值:
- 如果一个运算数是对象,并且该对象左边的运算数值均为 false,则返回该对象。
- 如果两个运算数都是对象,返回第一个对象。
- 如果最后一个运算数是 null,并且其他运算数值均为 false,则返回 null。
- 如果最后一个运算数是 NaN,并且其他运算数值均为 false,则返回 NaN。
- 如果某个运算数是 undefined,则根据另一个运算数返回。
undefined || null // null
null || undefined // undefined
undefined || 0 // 0
0 || undefined // undefined
undefined || 123 // 123
undefined || 'hello' // 'hello'
5.关系运算符< >
返回的结果是boolean类型,更偏向于数字的操作,任何包含 NaN 的关系运算符都要返回 false
6.等性运算符
ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。
===
全等:数据类型和值完全一致
==
相等:undefined == null
,数字,字符串,boolean类型进行比较时,先转换为数字再进行比较,等号和非等号( ==
, !=
)
- 在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回
true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回
true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。 执行类型转换的规则如下:- 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
- 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
- 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
- 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
在比较时,该运算符还遵守下列规则: 值 null 和 undefined 相等。 在检查相等性时,不能把 null 和 undefined 转换成其他值。 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
重要提示: 即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。 全等号和非全等号
- 全等号由三个等号表示(
===
),只有在无需类型转换运算数就相等的情况下,才返回 true。