数据类型运算符流程控制语句

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

  • 7种数据类型,Number, String, Boolean, Undefined, Null, Object, Symbol
  • 原始类型,Number, String, Boolean, Undefined, Null, Symbol
  • 复杂类型,Object
  • 原始类型和复杂类型的区别是什么
    • 基本(原始)类型变量存的是值(栈内存),复杂类型的变量存的是内存地址(堆内存)
    • 基本(原始)类型在赋值的时候拷贝值,复杂类型在赋值的时候只拷贝地址,不拷贝值
    • 详细解释:方方: JS里基本类型(值)和复杂类型(引用)有什么区别?

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

  • typeof,作用于用于判断一个一个表达式、对象或原始值的数据类型,返回的是一个字符串,返回的值有(参照mdn):
类型 结果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol (ES 6新增) "symbol"
宿主对象 (由JS环境提供) Implementation-dependent
函数对象 "function"
其他对象 "object"
  • instanceof,用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,语法为object instanceof constructor,object 为要检测的对象,constructor 为某个构造函数,返回值为 true 或 false,如:
var a = {};
var b = [];
a instanceof Object;   //true
b instanceof Array;     //true
[] instanceof Array;     //true

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

  • 用 typeof 直接进行判断
typeof a;        //"object"
typeof 2;        //"number"
typeof 'a';       //"string"
typeof true;    //"boolean"
function fn(){}
typeof fn;       //"function"

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

  • NaN (Not a Number),typeof NaN //number 它本身是数值类型,但是它表示的是一个非数值,用于表示一个本来要返回数值的操作数未返回数值的情况
  • 特别之处:
    • 任何涉及到 NaN 的操作(例如 NaN/100)都会返回NaN
    • NaN 与任何值都不相等,包括 NaN 本身,所以判断一个值是否是 NaN,只能用函数Number.isNaN()isNaN()
NaN == NaN;               // false
NaN === NaN;             // false
Number.isNaN(NaN);   //true
isNaN(NaN);                // true

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

  • Number() ,可以用于任何数据类型,转换规则如下
    • Boolean值,true 和 false 分别被转换为1 和 0
    • 数值,不变
    • Null,0
    • Undefined,NaN
    • 字符串,遵循如下规则
      1. 字符串中只包含数字(包括前面的 + - 号),则将其转换为十进制数值(会忽略前导的 0)
      2. 如果包含有效的浮点格式,则将其转换为浮点数(会忽略前导的 0)
      3. 如果包含有效的十六进制格式,则将其转换为相同大小的十进制数值
      4. 空字符串,0
      5. 如果字符串中包含除上述格式之外的字符,则将其转换为NaN
    • 对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值
Number(true);         //1
Number('');              //0
Number('00123');    //123
Number('hello');      //NaN
  • parseInt(),专门用于把字符串转换成数值,常用于处理整数
    • 忽略字符串前面的空格,如果第一个非空格字符不是负号或者数字字符,则返回 NaN
    • 如果是继续解析,直到解析完或者遇到了非数字字符
    • 可以指定第二个参数即转换时使用的基数
    • 不能识别小数点
    • 空字符串返回 NaN
parseInt('1234blue');   //1234
parseInt('');                  //NaN
parseInt('A7C',16);      //2684
  • parseFloat(),专门用于把字符串转换成数值,常用于处理浮点数,与 parseInt() 相比区别如下
    • 可以识别字符串中第一个小数点
    • 只解析十进制值
    • 如果字符串可解析为整数,则返回整数
parseFloat('1234blue');   //1234
parseFloat('22.4.5');        //22.4
parseFloat('0xAB');         //0
parseFloat('1.68e8');       //168000000

参考书籍《JS高程》

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

  • ==,先转换在比较
    转换规则如下
    • 如果有一个数是布尔值,则在比较相等性之前先将其转换为数值,true 为 1,false 为 0
    • 如果一个操作数是字符串,另一个操作数是数值,则在比较之前先将字符串转换
    • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值照前面的规则进行比较
      比较规则
    • undefined 和 null 是相等的
    • 如果有一个操作数是 NaN,则相等操作符返回 false
    • 如果两个操作数都是对象,则比较是不是同一个对象,如果两个操作数都指向同一个对象,相等操作符返回 true
'1' == 1;                    //true
true == 1;                 //true
undefined == null;    //true
NaN == 'NaN';          //false
  • ===,仅比较不转换,仅在两个操作数未经转换就想等的情况下返回 true

7. break与continue有什么区别?

  • break,会立即退出循环,强制执行循环后面的语句。如下例:
var num = 0;
for (var i = 1; i < 10; i++) {
    if(i % 5 == 0) {
        break;
    }
    num++;
}
alert(num);      //4
  • continue,也是立即退出循环,但退出循环后会从循环的顶部继续执行
var num = 0;
for (var i = 1; i < 10; i++) {
    if(i % 5 == 0) {
        continue;
    }
    num++;
}
alert(num);      //8

参考书籍《JS高程》

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

  • undefined,undefined 并不是保留词(reserved word),它只是全局对象的一个属性。在低版本 IE 中能被重写。
var undefined = 10;
alert(undefined);
// undefined -- chrome
// 10 -- IE 8

undefined 在 ES5 中已经是全局对象的一个只读(read-only)属性了,它不能被重写。但是在局部作用域中,还是可以被重写的,所以undefined现常用于全局环境。

(function() {
  var undefined = 10;      //局部变量
  alert(undefined);
})();
  // 10 -- chrome

(function() {
  undefined = 10;      //全局变量
  alert(undefined);
})();
  // undefined -- chrome
  • void 0,void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void 后面你随便跟上一个表达式,返回的都是 undefined,都能完美代替 undefined!更重要的前提是,void 是不能被重写的(cannot be overidden)。事实上,不少 JavaScript 压缩工具在压缩过程中,正是将 undefined 用 void 0 代替掉了。
    参考文章:为什么用「void 0」代替「undefined」

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

console.log(1+1);            //2,两数值相加,直接计算
console.log("2"+"4");        //"24",两字符串相加,直接拼接
console.log(2+"4");          //"24",只有一个操作数是字符串,将另一个转换为字符串,进行拼接     
console.log(+"4");           //4,对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换

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

var a = 1;
a+++a;                 //3,++优先级高,可写为(a++) + (a),1+2=3
typeof a+2;            //"number2", typeof 的优先级比较高,先输出 typeof a
 的结果字符串"number",再与数值2进行加法操作,得到结果字符串"number2"

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

 var a = 1;
 var b = 3;
 console.log( a+++b );        
//4,++优先级高,先执行 a++,在+ b,即 1+3
原因:a++ 返回原来的值,++a返回加1后的值。

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

var arr = [3,4,5]
for (var 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,+,>,||;||逻辑或运算符在第一个操作数是对象时,返回第一个操作数

var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//undefined, == 的优先级高于 &&, &&逻辑与操作符在第一个操作数是对象时,返回第二个操作数,data = 'bb',
**但此处有坑,console.log('haha'); 控制台输出的是haha,但是将console.log('haha');这个语句赋值给一个变量,那么这个变量,就是undefined。(偷看了前面学姐的答案!)**

var data2 = d = 0 || console.log('haha')
console.log(data2)
//undefined,||逻辑或运算符在第一个操作数的求值结果是 false 时,返回第二个操作数,data2 = 'haha'

var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
//2,!!为取两次非,优先级顺序为 ! !!,+,,;var x = true + true;

你可能感兴趣的:(数据类型运算符流程控制语句)