数据类型,运算符优先级,流程控制

1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?

  • 定义的数据类型有:数值、字符串、布尔、对象、undefined、null
  • 原始类型:数值、字符串、布尔
  • 复杂类型:对象
  • 区别:原始类型数据不能再细分;复杂类型,是由多个原始类型合成,可以看作一个存储各种值的容器。
    至于undefined,null一般将它们看成两个特殊值。

2.typeof和instanceof的作用和区别?

  • typeof 一般用于判断原始类型,还可以用于判断变量是否赋值.
  • instanceof一般用于判断一个变量是否为某个对象的实例。

3.如何判断一个变量是否是数字、字符串、布尔、函数

用typeof运算符进行判断数字、字符串、布尔、函数,分别返回number, string,boolean,fuction。

4.NaN是什么? 有什么特别之处?

NaN是指NOT a Number,用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了),就会返回“NaN”值。NaN 值非常特殊,因为它“不是数字”,所以任何数跟它都不相等,甚至 NaN 本身也不等于 NaN 。

5.如何把非数值转化为数值?

使用Number() 、parseInt() 、parseFloat()把非数值转化为数值

  • Number():当转换原始类型数据时,它们都能被转成数值或NaN,Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN;Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组。
  • parseInt() :字符串若第一个数为数值,则返回数值,返回值为第一个数值到最后一个数值,数值之间没有字母,只取整数,遇到小数点后面的数就舍弃,若第一个数为字母,则直接返回NaN;Boolean、undefined、null返回NaN;数组返回数组的第一个数值;狭义的对象、函数返回NaN。
  • parseFloat():和parseInt()类似,只是遇到小数会保留。

6.==与===有什么区别

  • ==:相等运算符,比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下:
    1. 原始类型的数据会转换成数值类型再进行比较。
    2. 对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。
    3. undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。绝大多数情况下,对象与undefined和null比较,都返回false。只有在对象转为原始值得到undefined时,才会返回true,这种情况是非常罕见的。
    4. 相等运算符隐藏的类型转换,会带来一些违反直觉的结果。
 '' == '0'           // false
0 == ''             // true
0 == '0'            // true

2 == true           // false
2 == false          // false

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true
  • ===:严格相等运算符,它不仅比较值,而且还比较值的类型。比较规则:
    1. 如果两个值的类型不同,直接返回false;
    2. 同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false;
    3. 两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象;
    4. undefined和null与自身严格相等。

7.break与continue有什么区别

  • break:强制退出循环体,执行循环后的语句。
  • continue:退出本次循环,执行下一个循环。

注意:如果存在多重循环,不带参数的break语句和continue语句都只针对最内层循环。

8.void 0 和 undefined在使用场景上有什么区别

undefined 现常用于全局环境,不能被重写。但是在局部作用域中,还是可以被重写的。
void 是不能被重写的。 void 运算符能对给定的表达式进行求值,然后返回 undefined,最短的是void 0,所以用void 0 来表示undefined, void 0是在局部作用域中替代undefined的最佳选择,避免undefined被改写。

9.以下代码的输出结果是?为什么?

console.log(1+1);    // 2 数值类型的值相加
console.log("2"+"4"); // "24" 字符串类型变量进行拼接
console.log(2+"4");  // "24" 字符串和数值相加会把数值转换为字符串再进行拼接
console.log(+"4"); // 4  在只有一个字符串参数的时候会尝试将其转换为数字 

10. 以下代码的输出结果是?

var a = 1; 
a+++a;   // 3  ,++优先级高于 + ,先计算a++ ,1+2=3
typeof a+2; // "number2" , typeof 优先级高于 + ,先求type a ,"number" + 2 

11. 以下代码的输出结果是? 为什么

 var a = 1;
 var b = 3;
 console.log( a+++b );
结果为4 , a+++b = (a++)+b = 1+3 =4

12. 遍历数组,把数组里的打印数组每一项的平方

var arr = [3,4,5];
for(i in arr) {
  console.log(arr[i]*arr[i]);
}

13. 遍历 JSON, 打印里面的值

var obj = {
 name: 'hunger', 
 sex: 'male', 
 age: 28 
}
for (key in obj) {
  console.log(obj[key]);
}

14.

var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val) 
// 'number2',  typeof 优先级高于'+',typeof a + b 为'number2'为true,由于运算符是||,左边true则返回左边的值'number2'

var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
// "bb", 运行 console.log("bb")时的输出;
// undefined, data的值,data = true && console.log("bb"), console.log("bb")的值为undefined, 由于运算符为&&,第一个运算子的布尔值为true,则返回第二个运算子的值,则data为undefined

var data2 = d = 0 || console.log('haha')
console.log(data2)
// "haha", 运行console.log("haha")时的输出;
// undefined, 由于运算符为||,左运算子的布尔值为false,则返回右运算子的值,则data2为undefined
 
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 2 ,  !!"Hello" + (!"world", !!"from here!!") = !!(true)+(!true,!!true)=!!true + !!true =true+ true=  2
//逗号运算符用于对两个表达式求值,并返回后一个表达式的值。

你可能感兴趣的:(数据类型,运算符优先级,流程控制)