JavaScript 的数据类型
- JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型共有6种。
- 数值(number):整数和小数
- 字符串(string):字符组成的文本(例如:"Hello World")
- 布尔值(boolean):true(真)和false(假)两个特定值
- undefined:表示“未定义”或不存在,即此处目前没有任何值
- null:表示空缺,即此处应有一个值,但目前为空
- 对象(object):各种值组成的集合
- 原始类型
number、string、boolean称为原始类型的值,即他们是最基本的数据类型,不能在细分。 - 复杂类型
对象(object)则被称为复杂类型,因为一个对象往往是多个原始类型值的合成,可以看作是一个存放各种值的容器。其可以细分成Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型等。 - 二者区别
- 原始类型:
a.最基本的数据类型,不能再细分,数据存放在栈内存里。
b.基本类型的比较是值的比较。
c.变量存放在栈内存(stack)里。 - 复杂类型:
a.一个对象往往是多个原始类型值的合成,是一组数据和功能的集合。
b.引用类型的比较是引用的比较。
c.数据同时存放在栈内存和堆内存里,栈内存中保存了变量标识符和指向内存中该对象的指针,堆内存中保存了对象的内容。
- 原始类型:
typeof和instanceof的作用与区别
- typeof用于基本数据类型的类型判断,返回值都为小写的字符串。如果是对象,除了function类型会返回“function”, 其他对象统一返回“object”。
typeof 123 \\ number
typeof "abc" \\ string
typeof false \\ boolean
function f( ) { }
typeof f \\ funtcion
typeof { } \\ object
typeof null \\ object
typeof undefined \\ undefined
typeof应该注意的问题:
使用typeof操作符的时候,如果检测对象是函数,那么操作符返回"function" 。如果检测对象是正则表达式的时候,在Safari和Chrome中使用typeof的时候会错误的返回"function",其他的浏览器返回的是object。
- instanceof 利用原型链继承关系做判断,它针对对象类型(语法:对象 instanceof 构造函数)
var o = { };
var a = { };
o instanceof Array // false
a instanceof Array // true
> [1,2,3] instanceof Array
< ture
> var obj = { }
< undefined
> obj instanseof Array
< false
- 区别
- typeof是判断变量是什么基本类型的
- instanceof是判断对象到底是什么类型的
- typeof undefined 范例
eg:
没有声明a、b时,
> a+b
报错;
然而
> typeof b
< "undefined"
**利用这一点,typeof可以用来检查一个没有声明的变量,而不报错**
实际编程中,这个特点通常用在判断语句:
// 错误的写法
if (v) { } //报错
// 正确的写法
if (typeof v === "undefined") { }
不管 v 是否存在,都不报错
如何判断一个变量是否是数字、字符串、布尔、函数
使用typeof,看返回值
NaN
NaN含义是Not a Number,表示非数字,NaN和任何值都不相等,包括自己。
NaN == NaN; // false
parseInt('abc'); // NaN
非数值转化为数值
- 有三个函数可以把非函数转换为数值
- Number( )
- parseInt( )
- parseFloat( )
- Number( ):将任何类型的值转化为数值。但Number规则相当复杂而且不合理
转换规则如下:- 如果是Boolean值,true和false分别转化为1和0
- 如果是数字,只是简单的传入和返回
- 如果是null, 返回0
- 如果是undefined, 返回NaN
- 如果是如果是字符串,按照下面的规则:
- 如果只包含数字,则将其转化为十进制。
- 如果数字中包含浮点格式,比如‘1.1’转化为1.1
- 如果包含有效的十六进制,比如‘0xf’转化为15
- 如果字符串是空的(不包含任何字符)转化为0
- 如果包含上述其他的格式转化为NaN
- 如果是对象,则调用对象的valueOf()方法,依照前面的规则转化,如果结果为NaN,则调用对象的toString()方法,再次按照前面的方法转换返回的字符串
number (false) // 0
number (true) // 1
number (123) // 123
number (null) // 0
number (undefined) // NaN
number (0xe) // 14
number (" ") // 0
number ({toString:function( ){return '123'; }}) // 123
number ({valueOf:function( ){return 456; }}) // 456
- parseInt( )和parseFloat( )
- parseInt( ) :把值转换成整数
- parseFloat( ):把值转换成浮点数
- 使用规则:
- 忽略字符串前面的空白字符,找到第一个非空白字符
- 如果第一个字符不是-或者数字,返回NaN
- 如果是继续解析,知道非数值模式为止
- 0开头会当做八进制,0x开头会当做十六进制,但是可以制定第二个参数制定基数
parseInt('blue'); // NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101',2); // 5
==与===的区别
- === : 严格相等(全等操作符),两个被比较的值在比较前都不进行隐式转换。若两者类型不同,则值不相等。
- ==: 非严格相等(相等操作符),在比较前将两个被比较的值转换为相同类型。
- 一般来说,使用全等操作符总是对的,因为全等操作符的结果更容易预测,并且因为没有隐式转换,全等比较的操作会更快。
break与continue的区别
- break用于强制退出循环体,执行循环后面的语句
for (var i=1 ; i<10 ; i++) {
if (i % 4 ===0) {
break;
}
console.log(i);
} // 1,2,3
- continue用于退出本次循环,执行下次循环
for (var i=1 ; i<10 ; i++) {
if(i % 4 ===0) {
continue;
}
console.log(i);
} // 1,2,3,5,6,7,9
void 0 和 undefined在使用场景上的区别
undefined可以在局部作用域中被重写,
而void运算返回值都是undefined。
function fn() {
var undefined = 3;
var a;
if { a===undefined }{
console.log('===')
} else {
console.log('!==')
}
}
fn() // !==
function fn() {
var undefined = 3;
var a;
if { a===void 0 }{
console.log('===')
} else {
console.log('!==')
}
}
fn() // ===
以下代码输出结果是什么?为什么?
console.log(1+1); //2,数字相加
console.log("2"+"4"); //"24",字符串拼接
console.log(2+"4"); //"24",类型不同,转换为字符串,拼接
console.log(+"4"); //4,字符串转换为数字
- 加法运算符对不同的数据类型有不同的含义
- 在两个操作数都是数字的时候,会做加法运算
- 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
- 在参数有对象的情况下会调用其valueOf或toString
- 在只有一个字符串参数的时候会尝试将其装换为数字
- 在只有一个数字参数的时候返回其正数值
代码分析
var a = 1; // a=1
a+++a; // 相当于(a++)+a,a经过自增运算后为2,但(a++)为1,故该式为3
typeof a+2; // typeof优先级高于+,即相当于(typeof a)+2,即"number2"
var a = 1; // a=1
var b = 3; // b=3
console.log( a+++b ); // (a+++b)即((a++)+b),(a++)为1,1+3=4
遍历数组[3,4,5],把数组里的打印数组每一项的平方
var arr = [3,4,5];
for (var i = 0; i<arr.length; i++){
console.log(arr[i]*arr[i])
}
遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28 ;
}
for (var key in obj) {
console.log(obj[key]);
}
以下代码输出结果是? 为什么?
逻辑或(||):如果expr1能转换成true则返回expr1,否则返回expr2. 因此,在boolean环境(在if的条件判断中)中使用时, 二者操作结果中只要有一个为true,返回true;二者操作结果都为false时返回false.
逻辑与(&&):如果expr1 能转换成false则返回expr1,否则返回expr2. 因此, 在Boolean环境中使用时, 两个操作结果都为true时返回true,否则返回false.
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
/*
(typeof a + b) = "number2" , "number2" || c >0则输出"number2"
*/
console.log(val) // number2
var d = 5;
var data = d ==5 && console.log('bb') //d ==5为ture,故data =console.log('bb')
console.log(data) //console.log(data)=console.log(console.log('bb')),值为 undefined;
var data2 = d = 0 || console.log('haha')
/*
相当于var data2 = d = (0 || console.log('haha'))
即data2 = console.log('haha')
*/
console.log(data2) //console.log(data2)相当于console.log(console.log('haha')),即undefined
var x = !!"Hello" + (!"world", !!"from here!!");
/*
!!"Hello"为true
(!"world", !!"from here!!")即((!"world"), (!!"from here!!")),(false,true)→true
x = true + true = 1+1=2
*/
console.log(x) // 2