检测数据类型
type()
a=1
print(type(a)) #<class 'int'>
b = 1.1
print(type(b)) # <class 'float'> -- 浮点型
c = True
print(type(c)) # <class 'bool'> -- 布尔型
d = '12345'
print(type(d)) # <class 'str'> -- 字符串
e = [10, 20, 30]
print(type(e)) # <class 'list'> -- 列表
f = (10, 20, 30)
print(type(f)) # <class 'tuple'> -- 元组
h = {10, 20, 30}
print(type(h)) # <class 'set'> -- 集合
g = {'name': 'TOM', 'age': 20}
print(type(g)) # <class 'dict'> -- 字典
转换数据类型
num1 = 1
print(float(num1)) # 1.0
print(type(float(num1))) # <class 'float'>
num2 = 10
print(type(str(num2))) # <class 'str'>
list1 = [10, 20, 30]
print(tuple(list1)) # (10, 20, 30)
print(type(tuple(list1))) # <class 'tuple'>
t1 = (100, 200, 300)
print(list(t1)) # [100, 200, 300]
print(type(list(t1))) # <class 'list'>
str1 = '10'
str2 = '[1, 2, 3]'
str3 = '(1000, 2000, 3000)'
print(type(eval(str1))) # <class 'int>
print(type(eval(str2))) # <class 'list'>
print(type(eval(str3))) # <class 'tuple'>
print(eval(str1)) # 10
print(eval(str2)) # [1, 2, 3]
print(eval(str3)) # (1000, 2000, 3000)
最近边整理自己的笔记边复习,如果出现错误,希望路过的大佬能帮忙指出。
数据类型
《JS高程第3版》 第3.4章 数据类型 | 第5章 引用类型
-
基本数据类型
- 共6种:string number boolean null undefined symbol(ES6新增)
-
引用类型
- 除基本数据类型外的。
- 基本数据类型的3种包装类型(String Number Boolean)也是引用类型。
类型检测
基本数据类型的检测
typeof
基本数据类型中除null外,均可以准确检测。另可以检测Function。
1 |
typeof ‘str’ //”string” |
应用:判断变量是引用类型(递归实现深拷贝用到过)
1 |
!obj[k] == null && (typeof obj[k] === “object” || typeof obj[k] === “function”) |
引用类型的检测
1. instanceof
不能在多全局对象的情况(例如:多个 frame 或多个 window 之间的交互) —— MDN
所以数组可以使用Array.isArray()。其他类型见后述方法。
2. Object.prototype.toString.call(myObj) === ‘[object Type]’
Object.prototype上有一个toString()方法,返回一个表示该对象的字符串。
判断引用类型和基本数据类型的类型,可以使用该方法。
1 |
// MDN的示例代码 toString.call(new Date); // [object Date] // Since JavaScript 1.8.5 |
其他构造函数的原型对象继承了该方法,但改写成了输出内容字符串。所以需要用call()修改Object原型上的toString()的this后调用。
3. instance.constructor ==(=) Function 或 instance.__proto__.constructor ==(=) Function
用constructor是可以串联起实例和构造函数的,但是constructor的值是可以被修改的,所以不要这样判断。
数据类型转换
一是各类型互相转换的规则;二是不同运算符需要转换成哪些类型。
类型转换规则
类型转换一共3种情况:转布尔、转数字、转字符串。
-
转布尔值
只有null undefined、””、+0、-0、false、NaN 这7种情况转布尔结果是false,其余情况包括-1、”0″都会转为true。
-
转数字
1 |
// 字符串:能直接写成数字,和NaN // 数组:空数组或只有一个数字元素,和NaN // 其它引用类型:NaN // 特殊基本类型 |
- 转字符串
1 |
// 数字、布尔、函数:直接加引号 // 数组 // 对象 |
运算符与类型转换
都有哪些运算符:《JS高程 3.5操作符》、表达式和运算符 – MDN
1. 关系运算符(> | >= | < | <= | ==)
《JS高程 3.5.6关系运算符》
两边数据类型相同才能进行比较。会转成数字或字符串类型,转成数字类型的优先级 》 转字符串。
基本类型和基本类型比较
1 |
// 类型相同不转换 // 数字 和 字符串 转 数字 // 布尔 和 数字或字符串 转 数字 // null undefined比较特别 null >= 0 // true。>= <=是true,其余情况null和0比较都是false。 |
引用类型和基本类型比较
1 |
// 和数字 转数字 // 和布尔 转数字 // 和字符串 先调用valueOf(),如果返回基本数据类型,就用结果进行比较;否则再调用toString() [2] == “2” // true |
引用类型和引用类型
比较内存地址
当且仅当与原始值比较时,对象会被转换为原始值。当两个操作数均为对象时,它们作为对象进行比较,仅当它们引用相同对象时返回true。 —— MDN
1 |
// 下面两个比较特殊。由于逻辑非运算符的存在,会转成数字进行比较。 |
2. 算术运算符
减乘除余,都转成数字。下面只写加法。
基本类型、数组
转字符串优先级 》 转数字
1 |
// 有字符串转字符串 // 没字符串有数字,基本类型转数字,引用类型转字符串 // 都没有,基本类型转数字,引用类型转字符串 |
对象
1 |
// 在 + 运算时,另一项无论是数字、字符串,都转字符串 |
-
注:控制台测验时声明变量需注意:定义变量后运算和直接用{}方式,结果不同。
- {} 在运算符前面,不会被认为是对象,而被认为是代码块。另一项无论是数字、字符串,都转数字。
- {} 在运算符后面,或者先声明一个对象变量,那么它还是对象。
1
2
3
4
5{} + 1 // 1
{a: 1} + 1 // 1
{} + “1” // 1
{} + “a” // NaN
{a: 1} + “b” // NaN- 如果放在console.log()里,对象不会被认为是代码块。
3. 逻辑运算符
与
- 短路运算符。前项是真 -> 直接返回后项;前项是假 -> 直接返回前项。
1 |
0 && 2 // 0 |
或
- 短路运算符。前项是真 -> 直接返回前项;前项是假 -> 直接返回后项。
1 |
0 || 2 // 2 |
非
- 转布尔。
- 优先级最高。