首页 > 网站开发 > JavaScript >
-
JavaScript教程之JavaScript的数据类型问题总结
一 JS中有哪些数据类型?
-- 共 6 种数据类型,其中 5 种基本数据类型Undefined,Null,Boolean,Number和 String,1 种复杂数据类型Object。因为ECMAScript不支持创建任何自定义的类型,所以最终所有的类型都是其中 6 种数据类型之一。(ES6中新增了第七种数据类型Symbol)
1-1 原始类型/值类型(传递值):Number,String,Boolean + 合成类型/引用类型(传递指针):Object + 特殊类型:Undefined,Null
1-2 object:狭义对象-object + 数组-array + 函数-function
二 JS如何识别值的类型?
-- 3种方法:typeof,instanceof,Object.prototype.toString
2-1 typeof(检测基本数据类型)返回number,string,boolean,function,undefined + 其余的都是object(array,null,object,window,等等)
2-1eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
typeof 1 + "<br>" + //number
typeof NaN + "<br>" + //number
typeof "hello" + "<br>" + //string
typeof false + "<br>" + //boolean
typeof function () {} + "<br>" + //function
typeof myCar + "<br>" + //undefined
typeof [1,2,3] + "<br>" + //object
typeof {name:'fermin', age:22} + "<br>" + //object
typeof new Date() + "<br>" + //object
typeof null; //object
</script>
</body>
2-1-1 用typeof获取变量是否存在, if(typeof a!="undefined"){}
2-2 incetanceof(检测引用数据类型,非引用数据返回false)对应的引用类型数据返回true
2-2eg:
<body>
<p id = "demo"></p>
<script>
var reg = new RegExp;
document.getElementById("demo").innerHTML =
({} instanceof Array) + "<br>" + //false
([] instanceof Array) + "<br>" + //true
(reg instanceof RegExp) + "<br>" + //true
("hello" instanceof String); //false 非引用数据都返回false
</script>
</body>
2-3 Object.prototype.toString精确判断对象的类型
2-3eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
Object.prototype.toString.call(123) + "<br>" + //[object Number]
Object.prototype.toString.call('123') + "<br>" + //[object String]
Object.prototype.toString.call(true) + "<br>" + //[object Boolean]
Object.prototype.toString.call(undefined) + "<br>" + //[object Undefined]
Object.prototype.toString.call({}) + "<br>" + //[object Object]
Object.prototype.toString.call([]) + "<br>" + //[object Array]
Object.prototype.toString.call(function () {}); //[object Function]
</script>
</body>
三 JS的类型转换
-- JavaScript 变量可以转换为新变量或其他数据类型,有两种类型转换方式,强制(显示)类型转换(String(), toString(), Number(), parseInt(string,radix), parseFloat(string), Boolean() )和自动(隐式)类型转换(isNaN(),一元操作符,算术运算符,逻辑运算符,比较运算符,if语句)
3-1 JS的强制类型转换
3-1-1 强制转换为数值类型:Number(),parseInt(string,radix),parseFloat(string)
转换规则
(1)Number()转换规则,整体转换字符串类型
(a)数值:转换为十进制数
(b)字符串:空字符串 -> 0 只包含数字/有效浮点格式 -> 十进制/浮点格式,忽略前导0,其余转成NaN
(c)布尔值:true-> 1 false-> 0
(d)undefined:转成NaN
(e)对象:会调用自身valueOf(),返回原始类型值后用上述方法,否则再调用toString。若返回了原始类型再用上述转换规则,否则系统报错
(f)null: 转成0
(1)eg
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
Number(011) + "<br>" + // 9 识别了前导0转换成八进制
Number('011') + "<br>" + // 11
Number('0') + "<br>" + // 0
Number('1a') + "<br>" + // NaN
Number('') + "<br>" + // 0
Number(true) + "<br>" + // 1
Number(undefined) + "<br>" + // NaN
Number({}) + "<br>" + //NaN
Number(null) + "<br>" + // 0
Number([]) + "<br>" + // 0
Number(function () {}); // NaN
</script>
</body>
(2)Number()与parseInt(string,radix),parseFloat(string)的转换规则异同
Number整体转换字符串类型,parseInt和parseFloat逐个解析字符,只把数字转换出来,其余都转换为NaN
(2)eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
parseInt(011) + "<br>" + // 9
parseInt('01') + "<br>" + // 01
parseInt('1a') + "<br>" + // 1
parseInt('1a2b') + "<br>" + // 1
parseInt('') + "<br>" + // NaN 与Number不同
parseInt(true) + "<br>" + // NaN 与Number不同
parseInt(undefined) + "<br>" + // NaN
parseInt({}) + "<br>" + //NaN
parseInt(null) + "<br>" + // NaN
parseInt([]) + "<br>" + // NaN
parseInt(function () {}); // NaN
</script>
</body>
3-1-2 强制转换为字符串类型:String()
转换规则
(1)String()转换规则,任意类型转化成字符串
(a)布尔,undefined,null都是两边加""转化为字符串,数值会转换成十进制数再加""转换为字符串,而字符串本身不变
(b)对象调用toString(),若返回原始类型值,再使用String()转换,否则再调用valueOf(),若返回原始类型,再使用String()转换,在否报错
(1)eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
String(011) + "<br>" + // "9"
String('011') +