blog icon indicating copy to clipboard operation
blog copied to clipboard

JS basics

Open nanyang24 opened this issue 7 years ago • 0 comments

数据类型

JavaScript 语言的每一个值,都属于某一种数据类型。共有六种数据类型。(ES6 又新增了第七种 Symbol 类型的值)

  1. 数值(number):整数和小数(比如1和3.14)
  2. 字符串(string):字符组成的文本(比如”Hello World”)
  3. 布尔值(boolean):true(真)和false(假)两个特定值
  4. undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  5. null:表示无值,即此处的值就是“无”的状态。
  6. 对象(object):各种值组成的集合
  • 通常,我们将数值、字符串、布尔值称为原始类型(也叫基本类型/简单类型)(primitive type)的值,即它们是最基本的数据类型,不能再细分了。
  • 而将对象称为引用类型(也叫合成类型/复杂类型)(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
  • 至于undefined和null,一般将它们看成两个特殊值。

对象又可以分成三个子类型。

  1. 狭义的对象(object)
  2. 数组(array)
  3. 函数(function)
  • 狭义的对象和数组是两种不同的数据组合方式,而函数其实是处理数据的方法。JavaScript把函数当成一种数据类型,可以像其他类型的数据一样,进行赋值和传递,这为编程带来了很大的灵活性,体现了JavaScript作为“函数式语言”的本质。

typeof运算符

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

  1. typeof运算符
  2. instanceof运算符
  3. 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运算符的详细解释,请见后续

数值转换

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

  1. Number() 可用于将任何类型转化为数值
  2. parseInt()
  3. 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 基本类型的值)

  1. 数值(number):整数和小数(比如1和3.14)
  2. 字符串(string):字符组成的文本(比如”Hello World”)
  3. 布尔值(boolean):true(真)和false(假)两个特定值
  4. undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  5. null:表示无值,即此处的值就是“无”的状态。
  6. 对象(object):各种值组成的集合

其中:

  • 数值、字符串、布尔值、Symbol() 函数是原始类型(primitive type)
  • 对象是复杂类型(complex type)
  • undefined和null是两个特殊值

区别:

  • 原始类型是最基本的数据类型,不能再细分了。
  • 复杂类型一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。狭义的对象(object)可细分为数组(array)、函数(function)、正则表达式 (regexp)。

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

作用:

  • typeof操作符返回一个字符串,指示未经计算的操作数的类型。
  • instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

区别:

  • typeof:

    1. typeof 一般只能返回如下几个结果number,boolean,string,function,object,undefined。
    2. 我们可以使用 typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")}。
    3. 对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。 typeof window // "object" typeof {} // "object" typeof [] // "object" typeof null // "object"
  • instanceof:

    1. 返回true或者false
    2. 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. 如何把非数值转化为数值?

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

  1. Number() 可用于将任何类型转化为数值
  2. parseInt()
  3. parseFloat() parseInt parseFloat 用于将字符串转为数值
忽略字符串前面的空白字符,找到第一个非空白字符
如果第一个字符不是-或者数字返回NaN
如果是继续解析,直到非数值模式为止
0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数
 
	parseInt('blue'); //NaN
	parseInt('-23ABS'); // -23
	parseInt('0xf1'); // 241
	parseInt('101', 2); // 5

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

  1. === 是严格意义的相等,注意NaN和NaN不等
  2. == 是近似相等,javascript会帮我们做类型转换,造成一些匪夷所思的结果
  • 如果两个值类型相同,则执行严格相等的运算
  • 如果两个值的类型不同
    1. 若一个是null,一个是undefined,那么相等
    2. 若一个是数字,一个是字符串,先将字符串转为数字,然后比较
    3. 若一个值是true/false则将其转为1/0比较
    4. 若一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
    5. 。。。其它就不相等了 null==undefined; NaN==NaN "1"==true

7. break与continue有什么区别

break 用于强制退出循环体,执行循环后面的语句 continue 用于退出本次循环,执行下次循环

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

  1. undefined 并不是保留词(reserved word),在局部作用域中,可以被重写。
  2. 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

nanyang24 avatar Jul 24 '17 12:07 nanyang24