数据类型、运算符、流程控制语句
1、数据类型
1.1、JavaScript 定义了几种数据类型?
6+1
原始类型:null、undefined、number、string、bool、symbol(ES6)
复杂类型:object(function array)
常用的六种数据类型,分别是:
数值(number):整数和小数(比如1和3.14)
字符串(string):字符组成的文本(比如"Hello World")
布尔值(boolean):true(真)和false(假)两个特定值
未定义(undefined):表示“未定义”或不存在,即此处目前没有任何值
空对象(null):表示空缺,即此处应该有一个值,但目前为空
对象(object):各种值组成的集合
1.2、哪些是简单类型?哪些是复杂类型?
基本数据类型:
数值、字符串、布尔值称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。
复合数据类型:
将对象称为复杂类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
对象又可以分成三个子类型。
- 狭义的对象(object)
- 数组(array)
- 函数(function)
- 正则表达式 (regexp)
特殊数据类型:
空对象 Null
未定义 Undefined
2、运算符
- 算数二元运算符
+ - * / %
- 字符串连接符
+
- 比较运算符
== != === !== < > <= >=
- 逻辑运算符
&&(与) ||(或)
短路特性/短路计算
console.log(null && "user")
// null
console.log("karl" && "user")
// user,且运算,从左往右返回第一个falsy值,若无falsy值,返回最后一个值
console.log(null || "user")
// user
console.log("karl" || "user")
// karl,或运算,从左往右返回第一个truthy值,若无truthy值,返回最后一个值
- 一元运算符
- 表示负数
! 表示逻辑非
typeof 用于查询值的类型
- 条件运算符(三元运算符)
console.log(true ? 1 : 2);
// 1,条件为真时取中间的值
console.log(false ? 1 : 2);
// 2,条件为假时取右边的值
位运算
| 按位或:不同为1
& 按位于:不同为0
^ 按位异或:相同为0,不同为1
~ 按位非:正数非后为负并+1;负数非后为正并-1
>> 按位右移(保留符号位)
>>> 按位右移 (不保留符号位)
<< 按位左移(数字加倍)
任何数与自己做位异或都将得到0
任何数与0按位异或都将得到自己
2.1、如何判断一个变量是否是数字、字符串、布尔、函数?
使用typeof进行判断
typeof 111 === 'number'
typeof '111' === 'string'
typeof true ==='boolean'
typeof a ==='function'
2.2、typeof和instanceof的作用和区别?参考
typeof +原始类型
instanceof +复杂类型
typeof:typeof运算符可以返回一个值的数据类型。
typeof "ABC"; //string
typeof true; //boolean
typeof 112; //number
typeof undefined; //undefined
typeof null; //object
instanceof:typeof在运算一个引用类型时,总是返回object。不能判断这个引用类型是根据那个函数实例化的。这个时候就需要用到instanceof。instanceof判断一个对象是否是另一个函数(或对象)的实例。
var array=new Array();
console.log(array instanceof Array); //true
var array = new Array();
console.log(array instanceof Object); //=>true 也会返回true,因为Array是object的子类
array是Array函数的一个实例对象,同时也是Object函数的实例。
区别:typeof和instanceof的目的都是检测变量的类型,两个的区别在于typeof一般是检测的是基本数据类型,instanceof主要检测的是引用类型。
我们要判断一个对象是否是数组时或者判断某个变量是否是某个对象的实例则要选择用instanceof运算符,因为typeof遇到null、数组、对象时都会返回object类型。
2.3、NaN是什么? 有什么特别之处?
NaN(Not a Number):非数值,不可以描述的数字,比如0/1
undefined:“未定义”或不存在。
null:表示空值,即该处的值现在为空。比如,调用函数时,不需要传入某个参数,这时就可以传入null。
5个falsy值(不通过if):
- undefined
- null
- 0
- ' '
- NaN
2.4、如何把非数值转化为数值?参考
在JavaScript中,有3个函数可以把非数值转换为数值,这三个函数分别是:
- Number()
- parselnt()
- parseFloat()
第一个函数,即转型函数 Nurnber() 可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这3个函数对于同样的输入会返回不同的结果。
2.5、==与===有什么区别?
==用于一般比较,在比较的时候可以转换数据类型;
===用于严格比较,只要类型不匹配就返回flase。
推荐使用===
3、流程控制语句
do{
}while(){
}
3.1、break与continue有什么区别?
break 用于强制退出循环体,执行循环后面的语句
continue 用于跳过本次循环,执行下次循环
8、void 0 和 undefined在使用场景上有什么区别?
用 void 0 代替 undefined 避免 undefined 被重写
undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写。
而void运算符的作用是执行一个表达式,然后返回的都是undefined,不能被重写。void 0最短,其实用void 1,void (1+1),void (0) 或者 void "hello",void (new Date()) 等等,都是一样的效果。
9.1、以下代码的输出结果是?为什么?运算符优先级参考
console.log(1+1); //2
console.log("2"+"4"); //24 双引号中是字符串
console.log(2+"4"); // 24
console.log(+"4"); //4
9.2、以下代码的输出结果是?
var a = 1;
a+++a; //3 ++的优先级高与+,相当于(a++)+a=1+2=3
typeof a+2; //number2 typeof的算符优先级高于+,相当于是(typeof a)+2
9.3、以下代码的输出结果是? 为什么
var a = 1;
var b = 3;
console.log( a+++b ); //4 ++的优先级高与+,相当于(a++)+b=1+3=4
9.4、遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5]
for (var i=0 ; i<arr.length; i++){
console.log(Math.pow(arr[i],2))
}
9.5、遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(var i in obj){
console.log(i,obj[i])
}
9.6、以下代码输出结果是? 为什么
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0 //typeof优先级最高,其次是+\>\||,相当于((typeof a)+b)||(c>0),或 前面部分不为0直接返回前面部分结果
console.log(val) //number2
var d = 5;
var data = d ==5 && console.log('bb') //bb ==优先级最高,d==5为true,所以&&直接返回后面的值,由于调用了console.log('bb') ,所以输出bb
console.log(data) //undefined 由于console.log()没有返回值,因此data=undefined,所以console.log(data)的输出结果为undefined
var data2 = d = 0 || console.log('haha') //haha
console.log(data2) //undefined 上题同理
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x) //2 !取反,!!再取反,空字符串为false,非空则为true,var x = true+(false+true),true为1,1+1=2
a++
++a