javascript 学习笔记 - 类型和变量

本贴最后更新于 2949 天前,其中的信息可能已经时移世改

js 是前端的基础。最近又对着《javascript 权威指南》重头学了一遍,感慨挺多。于是记录下看书过程中的关键点以备忘,相当于一个精简版的 javascript 权威指南。该笔记主要以代码为主,捎带讲解,因为我相信代码即是最好的说明。

一. 类型和变量

1.数据类型

关键点:

  • javascript 数据类型分为两类:原始类型和对象类型
  • 原始类型包括:字符串、数值、布尔、null 和 undefined
  • null(空)、undefined(未定义)是它们各自类型的唯一成员
  • 对象是属性的集合,每个属性由键值对组成。
  • 数组可看为是一种特殊的对象。普通对象是属性的无序集合,而它是属性的有序集合,且属性为数字
  • 函数可认为是具有可执行代码的特殊对象
  • js 变量是无类型的,可以被赋给任何类型的值

笔记:

类可看做是对象的子类型,是一类对象的集合。如数组和函数就是一类对象的集合。可以这样理解:凡符合属性为数字且有 length 属性的一类对象叫做数组,这些对象又赋予了各种方便数组操作的特殊行为。

除数组和函数外,js 还有三大内置类:Date()日期类、RegExp(正则类)、Error(错误类)。


//js的数值类型,用一个全局变量Infinity表示无穷大,NaN表示非数值  
//js在算术运算时,发生溢出或被0整除时不会报错。会返回Infinity或NaN  
//NaN表示非数值,它和任何值都不相等,包括它自身。判断一个数是否为NaN使用isNaN()
var num = 4/0;  
console.log(num); //Infinity  
console.log(0/0); //NaN    
var n1 = 'abc';  
var n2 = 0/0;  
console.log(isNaN(n1)); //true ,表示非数值  
console.log(isNaN(n2)); //true  
console.log(NaN==NaN); //false 

笔记(重要):

关于 js 中的假值是:0、-0、NaN、undefined、null、''。其他为真值。包括字符串'0'。

2.关于 null 和 undefined

关键点:

  • null 是关键字,而 undefined 是全局变量
  • **null==undefined 为 true,若比较需用严格相等符===**
  • 两者均为假值
  • *两者均无方法或属性,任何对它们的调用都会报错

//null和undefined都没有任何属性和方法。用它们调用会有类型错误。    
//null为特殊的对象,意为非对象,是关键字。 
//null用来表示数字、字符串、对象是非值的。是null类型唯一成员。  
console.log(typeof null); //object ,说明是一种特殊对象类型, 

//undefined是全局变量。表示变量没有初始化,说明属性或元素不存在或方法没有返回值  
//是全局变量,是undefined类型唯一成员。  
console.log(typeof undefined); //undefined  
console.log(null==undefined); //true ,两者都表示空值  
console.log(null===undefined); //false, 需用===严格相等运算符计算

3. 全局对象

关键点:

  • 全局对象无需声明即可使用
  
// 当页面重新加载时,会创建一个全局对象,这个全局对象有许多属性和全局方法,如:  
//全局属性: undefined,NaN  * 全局函数:isNaN(),parseInt(),eval();  
// 全局对象:Math、JSON  * 以上这些可直接使用。   
console.log(isNaN('dfg')); // true ,表明是非数字  
console.log(parseInt('23',10)); //23  
 

4.字符串、布尔和数值类型

关键点:

  • 字符串、数值、布尔的字面量不是对象,却有属性和方法
  • 当它们的字面量发生属性、方法调用时,会创建一个临时对象负责,调用完成,临时对象销毁
 
//关于字符串、数值、布尔类型  
//它们不是对象,但却有方法和属性,原因是:如字符串,当调用s.subString()时,  
//会通过new String()构建一个临时对象,方法的调用都是来自这个临时对象。  
//null和undefined没有包装对象,若访问会报错  
   
 var str = 'abc';  // 字面量可直接调用方法  
 console.log(str.charAt(0)); // a  
 console.log(str.substring(1,3)); // ab,包括起始边界不包括终止边界,[a,b)  
   
 var s1 = null;  
 //console.log(s1.charAt(0)); //TypeError: Cannot read property 'charAt' of null  
   
 //str为字符串类型,当调用其属性时,创建一个String的临时对象,  
 //将属性len赋值为4,执行后临时对象销毁  
 str.len = 4; 
 //再次访问,又重新创建临时对象并访问String对象的len,String没有len属性。  
 //修改只存在临时对象本身,并没有保存下来  
 console.log(str.len); // undefined 
   
 //注意: str2是用构造函数创建的String对象,与字面量的字符串不同,它是真正的对象。  
 var str2 = new String();  
 str2.len =4; //为对象添加一个新属性  
 console.log(str2.len); //4 ,输出属性
   

笔记:

可通过 String()、Boolean()、Number()创建的相应的对象,它们与用字面量创建的有所不同。前者是对象(包装对象),而后者是原始类型。类似于 java 中 intInteger 的概念。


 var s1='abc';  
 var s2 = new String('abc'); 
 console.log(typeof s1); // string  
 console.log(typeof s2); // object,可认为是string对应的包装类型,它是一种对象。  
 console.log(s1==s2); //true ,两者值相等  
 console.log(s1===s2); //false ,两者类型不相等  

5. 关于基本类型及对象

关键点:

  • 基本类型不可变,对象可变。这是它们重要的区别。
  • 基本类型是值的比较,而对象是引用地址的比较

部分对象与基本类型转换表:

转为字符串 转为数字 转为布尔 转为对象
undefined "undefined" NaN false throws TypeError
null "null" 0 false throws TypeError
true "true" 1 本身 new Boolean(true)
false "false" 0 本身 Boolean(false)
空串('') 本身 0 false new String("")
非空数字(1) 1 本身 true new String("1")
非空非数字('a') 本身 NaN true new String("a")
0 "0" 本身 false new Number(0)
NaN "NaN" 本身 false new Number(NaN)
Infinity "Infinity" 本身 true new Number(Infinity)
999(常数,非零) "999" 本身 true new Number(999)
 
 var s = '';  
 console.log(new Number(s)); // [Number:0] 
 
 var n = null;  
 console.log(new Number(n)); //[Number:0]  
 console.log(new String(n)); //[String:'null'] 

 var u = undefined;  
 console.log(new Number(u)); //[Number:NaN]  
 console.log(new String(u)); //[String:undefined]  

 var f = false;  
 console.log(new Number(f)); //[Number:0]  
 console.log(new String(f)); //[String:'false']  
 

6.对象与原始值的转换

前面提到原始值与对象的转换,对象转原始值较复杂,所以抽出一节来讲。

关键点:

  • 对象转布尔值全为真值。
  • 对象转字符串通过转换方法实现:toString()和 valueOf()

1. toString()函数

我们将对象分为包装对象(即字符串、布尔、数值的包装类)、特殊对象(即内嵌特殊行为的对象,是一类对象,如数组、日期、函数)、和普通对象。所有对象 都继承了此方法。默认实现只是简单输出对象的类型信息,而许多特定的对象(包装对象和类对象)又重新实现了它的行为,使其包含更多对象信息。

 
  //普通对象的toString方法  
  //固定输出[object Object]  
  var obj ={  
   a:'abc',  
   b:'bcd',  
   c:12,  
   d:function(){  
     console.log(this.a);  
    }  
   };  
   console.log(obj.toString()); //[object Object]  
   var obj2 ={  a:[1,2,3]  }  
   console.log(obj2.toString()); // [object Object]  


	 //包装对象的toString方法  
	 //输出其原始值    
	var b = new Boolean(true);  
	console.log(b.toString()); //true  
	var num = new Number(10);  
	console.log(num.toString()); //10  

	/**  
	 * 特殊对象,数组、函数、日期等的toString()方法  
	 * 各种类型均有特定实现  
	 */ 

	 //数组toString(),每个元素添加','组成字符串,与join(',')相同  
	 var arr = [1,2,3,4];  
	 console.log(arr.toString()); // 1,2,3,4  
	 console.log(arr.join(',')); //1,2,3,4  

	 // 日期toString(),输出表示日期时间的可读字符串  
	 var date = new Date();  
	 console.log(date.toString()); //Fri Oct 21 2016 08:11:00 GMT+0800 (中国标准时间)  
	 // 函数toString(),输出函数定义源码  
	 console.log(obj.d.toString()); // function (){console.log(this.a);}  
   

2. valueOf()函数

如果对象可以转为原始值,如包装类,则输出原始值,否则返回对象本身

   
	//若对象有原始值,valueOf()输出原始值  

	 var b = new Boolean(true);  
	 console.log(b.valueOf()); //true  
	 console.log(b); //[Boolean: true]  
	 var num = new Number(10);  
	 console.log(num.valueOf()); //10  
	 console.log(num); //[Number: 10]  
	 var str = new String('abc');  
	 console.log(str.valueOf()); //abc  
	 console.log(str); //[String: 'abc']  

	 /*  
	  * 若对象无原始值,则简单输出对象本身。需注意日期类输出的是它内部的表示值。  
	  */  
	  var obj ={  a:'abc',  b:'bcd',  c:12,  d:function(){  console.log(this.a);  }  };  
	  console.log(obj.valueOf()); //{ a: 'abc', b: 'bcd', c: 12, d: [Function] }  
	  console.log(obj); // { a: 'abc', b: 'bcd', c: 12, d: [Function] }  
	  var obj2 ={  a:[1,2,3]  }  
	  console.log(obj2.valueOf()); // { a: [ 1, 2, 3 ] }  
	  console.log(obj2); //{ a: [ 1, 2, 3 ] }  


	  //特殊对象,数组、函数、日期等的valueOf()方法  


	  //数组  
	  var arr = [1,2,3,4];  
	  console.log(arr.valueOf()); //[ 1, 2, 3, 4 ]  
	  console.log(arr); //[ 1, 2, 3, 4 ]  

	  // 日期  var date = new Date();  
	  console.log(date.valueOf()); //1477011865082  
	  console.log(date); // Fri Oct 21 2016 09:04:25 GMT+0800 (中国标准时间)  

	  // 函数  console.log(obj.d.valueOf()); 
	  // [Function]  console.log(obj.d); //[Function] 

提示: 可以将上述两段 toString()和 valueOf()代码结合起来,会有更深认识。

全文完

  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    728 引用 • 1273 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...