blog
blog copied to clipboard
JS basics
数据类型
JavaScript 语言的每一个值,都属于某一种数据类型。共有六种数据类型。(ES6 又新增了第七种 Symbol 类型的值)
- 数值(number):整数和小数(比如1和3.14)
- 字符串(string):字符组成的文本(比如”Hello World”)
- 布尔值(boolean):true(真)和false(假)两个特定值
- undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- null:表示无值,即此处的值就是“无”的状态。
- 对象(object):各种值组成的集合
- 通常,我们将数值、字符串、布尔值称为原始类型(也叫基本类型/简单类型)(primitive type)的值,即它们是最基本的数据类型,不能再细分了。
- 而将对象称为引用类型(也叫合成类型/复杂类型)(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
- 至于undefined和null,一般将它们看成两个特殊值。
对象又可以分成三个子类型。
- 狭义的对象(object)
- 数组(array)
- 函数(function)
- 狭义的对象和数组是两种不同的数据组合方式,而函数其实是处理数据的方法。JavaScript把函数当成一种数据类型,可以像其他类型的数据一样,进行赋值和传递,这为编程带来了很大的灵活性,体现了JavaScript作为“函数式语言”的本质。
typeof运算符
JavaScript有三种方法,可以确定一个值到底是什么类型。
- typeof运算符
- instanceof运算符
- Object.prototype.toString方法
其中typeof通常检测基本类型,但又可以区分函数和其他的对象 而instanceof检测引用类型
这里先着重介绍typeof运算符。
typeof运算符可以返回一个值的数据类型,可能有以下结果。
原始类型
数值、字符串、布尔值分别返回number、string、boolean。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
函数
函数返回function。
function f() {}
typeof f
// "function"
undefined
undefined返回undefined。
typeof undefined
// "undefined"
利用这一点,typeof可以用来检查一个没有声明的变量,而不报错。
v
// ReferenceError: v is not defined
typeof v
// "undefined"
上面代码中,变量v没有用var命令声明,直接使用就会报错。但是,放在typeof后面,就不报错了,而是返回undefined。
实际编程中,这个特点通常用在判断语句。
// 错误的写法
if (v) {
// ...
}
// ReferenceError: v is not defined
// 正确的写法
if (typeof v === "undefined") {
// ...
}
其他情况
除此以外,其他情况都返回object。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
从上面代码可以看到,空数组([])的类型也是object,这表示在JavaScript内部,数组本质上只是一种特殊的对象。
另外,null的类型也是object,这是由于历史原因造成的。1995年JavaScript语言的第一版,所有值都设计成32位,其中最低的3位用来表述数据类型,object对应的值是000。当时,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),完全没考虑null,只把它当作object的一种特殊值,32位全部为0。这是typeof null返回object的根本原因。
为了兼容以前的代码,后来就没法修改了。这并不是说null就属于对象,本质上null是一个类似于undefined的特殊值。
既然typeof对数组(array)和对象(object)的显示结果都是object,那么怎么区分它们呢?instanceof运算符可以做到。
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
instanceof运算符的详细解释,请见后续
数值转换
有三个函数可以把非数值转换为数值
- Number() 可用于将任何类型转化为数值
- parseInt()
- parseFloat() parseInt parseFloat 用于将字符串转为数值
忽略字符串前面的空白字符,找到第一个非空白字符
如果第一个字符不是-或者数字返回NaN
如果是继续解析,直到非数值模式为止
0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5
Object
对象,就是一种无序的数据集合,由若干个“键值对”(key-value)构成。key我们称为对象的属性,value可以是任何JavaScript类型,甚至可以是对象
var obj = {
name: 'jirengu',
age: 2
};
object的属性读取有两种方式
obj.name;
obj['name'];
运算符优先级
mdn 饥人谷
1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
JavaScript 语言的每一个值,都属于某一种数据类型。共有六种数据类型。(ES6 又新增了第七种 Symbol 基本类型的值)
- 数值(number):整数和小数(比如1和3.14)
- 字符串(string):字符组成的文本(比如”Hello World”)
- 布尔值(boolean):true(真)和false(假)两个特定值
- undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- null:表示无值,即此处的值就是“无”的状态。
- 对象(object):各种值组成的集合
其中:
- 数值、字符串、布尔值、Symbol() 函数是原始类型(primitive type)
- 对象是复杂类型(complex type)
- undefined和null是两个特殊值
区别:
- 原始类型是最基本的数据类型,不能再细分了。
- 复杂类型一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。狭义的对象(object)可细分为数组(array)、函数(function)、正则表达式 (regexp)。
2. typeof和instanceof的作用和区别?
作用:
- typeof操作符返回一个字符串,指示未经计算的操作数的类型。
- instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
区别:
-
typeof:
- typeof 一般只能返回如下几个结果number,boolean,string,function,object,undefined。
- 我们可以使用 typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")}。
- 对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。 typeof window // "object" typeof {} // "object" typeof [] // "object" typeof null // "object"
-
instanceof:
- 返回true或者false
- instanceof可以检测是什么类型的对象 var o = {}; var a = []; o instanceof Array // false a instanceof Array // true
3. 如何判断一个变量是否是数字、字符串、布尔、函数
var a;
typeof a === "number";//判断是否是数字
typeof a === "string";//判断是否是字符串
typeof a === "boolean";//判断是否是布尔
typeof a === "function";//判断是否是函数
4. NaN是什么? 有什么特别之处?
NaN含义是Not a Number,表示非数字,NaN和任何值都不相等,包括自己。
NaN === NaN//false
5. 如何把非数值转化为数值?
有三个函数可以把非数值转换为数值
- Number() 可用于将任何类型转化为数值
- parseInt()
- parseFloat() parseInt parseFloat 用于将字符串转为数值
忽略字符串前面的空白字符,找到第一个非空白字符
如果第一个字符不是-或者数字返回NaN
如果是继续解析,直到非数值模式为止
0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5
6. ==与===有什么区别
- === 是严格意义的相等,注意NaN和NaN不等
- == 是近似相等,javascript会帮我们做类型转换,造成一些匪夷所思的结果
- 如果两个值类型相同,则执行严格相等的运算
- 如果两个值的类型不同
- 若一个是null,一个是undefined,那么相等
- 若一个是数字,一个是字符串,先将字符串转为数字,然后比较
- 若一个值是true/false则将其转为1/0比较
- 若一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
- 。。。其它就不相等了 null==undefined; NaN==NaN "1"==true
7. break与continue有什么区别
break 用于强制退出循环体,执行循环后面的语句 continue 用于退出本次循环,执行下次循环
8. void 0 和 undefined在使用场景上有什么区别
- undefined 并不是保留词(reserved word),在局部作用域中,可以被重写。
- void 是不能被重写的。 void 运算符能对给定的表达式进行求值,然后返回 undefined。
- 所以在某些情境下undefined被赋值,可以用void 0代替undefined来进行判断。
9. 以下代码的输出结果是?为什么?
console.log(1+1); //2 两个操作数是数字会做加法运算
console.log("2"+"4"); //24 两个操作数是字符串,会做字符串拼接
console.log(2+"4"); //24 有一个为字符串操作数,会将另一个转换成字符串进行拼接
console.log(+"4"); //4 将某字符串转换成数字输出
操作符+ 在参数有对象的情况下会调用其valueOf或toString 在只有一个数字参数的时候返回其正数值
10. 以下代码的输出结果是?
var a = 1;
a+++a; //3 (a++)+a=1+2 , a++=1,a=2
typeof a+2; //"number2" typeof优先,typeof a求的是a的数据类型,得到'number',最后计算+2,将字符串'number'与数字2进行拼接得到'number2'
11. 以下代码的输出结果是? 为什么
var a = 1;
var b = 3;
console.log( a+++b ); //4 a++优先级最高,a++运算之后a结果为1,
a自增为2但不参与运算,所以a+++b为4
## 12. 遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5]
for (i=0 ; i<arr.length ; i++){
console.log(arr[i]*arr[i])
}
13. 遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (i in obj){
console.log(obj[i])
}
14. 以下代码输出结果是? 为什么 (选做题目)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//"number2"//先执行typeof a 得到'number','number'+2='number2',转化为boolean为true,不再执行||右边,结果就是'number2'
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//undefined// d==5结果是ture,&&运算左边为true要看右边,console.log()的返回值是undefined,所以data的值为undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
//undefined// 结果data2是undefined(????)
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
//2// true+(false,true) (,逗号)返回第二个操作数 true+true=2