HarleyWang93 / learning

学习
7 stars 0 forks source link

JS 数据类型&运算符&流程控制语句 #15

Open HarleyWang93 opened 7 years ago

HarleyWang93 commented 7 years ago

JavaScript 定义了几种数据类型?

JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型:

哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?

  1. 狭义的对象(object)
  2. 数组(array)
  3. 函数(function)
  4. 正则表达式 (regexp)

typeofinstanceof 的作用和区别?

首先,JavaScript 有三种方法,可以确定一个值到底是什么类型。

typeof 运算符
instanceof 运算符
Object.prototype.toString 方法

(1)原始类型

数值、字符串、布尔值分别返回numberstringboolean

typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"

(2)函数

函数返回function

function f() {}
typeof f
// "function"

(3)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") {
  // ...
}

(4)其他

除此以外,其他情况都返回object

typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"

那么这里就有个问题了,既然typeof对数组(array)和对象(object)的显示结果都是object,那么怎么区分它们呢?instanceof运算符可以做到。

区分数组和对象

var o = {};
var a = [];

o instanceof Array // false
a instanceof Array // true

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

eg:

typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"

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

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

有三个函数可以把非数值转换为数值

Number()
parseInt()
parseFloat()

==与===有什么区别

breakcontinue 有什么区别

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

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

console.log(1+1);  // 1 的类型为数值,所以做加法运算,结果为 2 。
console.log("2"+"4");  // "2""4" 的类型为字符串,所以将两个字符拼接起来,结果为 "24" 。
console.log(2+"4");  // 2 的类型为数值,"4" 的类型为字符串。所以会先将 2 的类型强制转换为字符串类型 "2",再与 4 拼接,结果为 "24" 。
console.log(+"4");  // 参数中只有字符串"4",会将字符串强制转化为数字 4,结果为 4 。

以下代码的输出结果是?

var a = 1;  
a+++a;  // (a++)+a  首先是 (a++) 的运算:这里 (a++) 的值为 1 ,a 的值为 2 。那么 (a++)+a 的运算为 1+2 ,所以这里的结果为 3 。
typeof a+2;  // (typeof a)+2  首先是 (typeof a) 的运算:a 的值为 2,数据类型为 number,那么 (typeof a) 的结果为 number。 (typeof a)+2 的结果为 "number2" 。

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

 var a = 1;
 var b = 3;
 console.log( a+++b );  //首先是 a+++b 的运算: (a++)+b 。 (a++) 的运算:a 的值为 2,但 (a++) 的值为 1。 所以 (a++)+b 的运算为 1+3 ,结果为 4

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

var arr = [3,4,5];
for (i=0;i<arr.length;i+=1) {
    console.log(arr[i]*arr[i]); //console.log(Math.pow(arr[i],2));
}

遍历 JSON, 打印里面的值

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

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

var a = 1, b = 2, c = 3;  //赋值
var val = typeof a + b || c >0  //"="的优先级最低,那么整体来看就是赋值。根据优先级,typeof a + b || c > 0 的运算:先进行(typeof a) + b的运算,结果为"number2";由于逻辑或的运算规则:如果第一个运算子的布尔值为 true ,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为 false ,则返回第二个运算子的值。所以 typeof a + b || c >0 输出的结果为"number2" ;最后赋值给 val ;所以结果为"number2"。
console.log(val)   // "number2"
var d = 5;  //赋值
var data = d ==5 && console.log('bb')  // "="优先级最低,那么整体来看就是赋值。d ==5 && console.log('bb') 的运算:由于逻辑与的运算规则:如果第一个运算子的布尔值为 true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为 false,则直接返回第一个运算子的值,且不再对第二个运算子求值。d==5 的值为 true;console.log('bb')的值为 undefined,所以 d ==5 && console.log('bb') 的值为 undefined;最后赋值给 data;所以结果为 undefined 。
console.log(data)  // undefined
var data2 = d = 0 || console.log('haha')  //整体为两次赋值。0 || console.log('haha')的运算:由于逻辑或,第一个运算子是 false,则返回第二个运算子的值,也就是 console.log('haha')的值  undefined,所以 undefined 赋值给 d,d 再 赋值给 data2,所以结果为 undefined 。
console.log(data2)  // undefined
var x = !!"Hello" + (!"world", !!"from here!!");  //整体来看为一次赋值。!!"Hello" + (!"world", !!"from here!!") 的运算: !!"Hello" 的值为 true;!"world" 的值为 flase, !!"from here!!" 的值为 true,而逗号运算符用于对两个表达式求值,并返回后一个表达式的值,所以 (!"world", !!"from here!!") 的值为 true;然后 true+true 的值为2,最后赋值给x。
console.log(x)  // 2

取反运算符形式上是一个感叹号,用于将布尔值变为相反值,即 true 变成 false,false 变成 true。 对于非布尔值的数据,取反运算符会自动将其转为布尔值。规则是,以下六个值取反后为 true,其他值取反后都为 false 。

undefined
null
false
0(包括+0和-0)
NaN
空字符串('')