本文为js高级程序设计学习笔记,笔记中不乏本人学习js的一些心得demo,喜欢的朋友可以直接参考原书“javascript高级程序设计”,写本笔记的目的是对js中容易出错、不易理解的地方作个笔记,以免后期继续踩坑。
1、语法
- 区分大小写:比如typeof用于测试数据类型,不同于typeOf,一个func完全可以定义为typeOf
- 标识符:首字符必须是字母、下划线或$,之后可以是数字、字母、下划线或$;标识符不能使用系统关键字及保留字,比如var、true、false、null、let等
- 严格模式:
严格模式是ECMAScript 5中引入的概念,是为js定义解析以及执行模型的一种机制,也是为了兼容旧版本的ECMAScript版本而引入的,就是一种编译指示,可以确定ECMAScript 3版本编译运行时的一些不确定行为。使用"use strict",方法如下:
function say(){ "use strict"; console.log("hello strict mode"); } say();
2、变量
所有未经初始化的变量始终为undefined,不论变量类型:
function say(){ var message = "hello message"; } say(); alert(message); //message未定义为undefined
但是如果省略了var关键字,则message自动上升为全局变量,不会报错:
function say(){ message = "hello message"; } say(); console.log(message);
结果:
变量声明初始化允许同时进行,比如:
var m1 = "1",m2 = "2",m3 = [1,2,3]; console.log(m1); console.log(m2); console.log(m3);
3、数据类型
ECMAScript 5定义js有5中基本类型+1种复杂数据类型(引用类型),基本类型:Undefined、Null、Boolean、Number、String,复杂类型:Object。
其中typeof操作符是用来测试数据类型的,typeof的返回值可以是如下几种:
“undefined”——唯一的Undefined类型值,表示“未定义”; “boolean”——对于Boolean的true or false返回; “string”——字符串返回; “number”——数值类型值返回; “object”——Object类型或者Null类型均返回; “function”——函数返回;
下面是简单测试:
var m1 = "message",m2 = true,m3 = 98,m4,m5 = {},m6 = null,m7 = function(){}; console.log(typeof m1); console.log(typeof m2); console.log(typeof m3); console.log(typeof m4); console.log(typeof m5); console.log(typeof m6); console.log(typeof m7);
Boolean类型的字面值true和false是区分大小写的,所有数据类型均可通过Boolean()转换函数转换为Boolean类型,对于Number类型,任何非零(包括无穷大)转换为true,0和NaN转换为false;对于Object类型来说,转换为true,null转换为false
关于NaN:
NaN(Not a Number)即非数值,是一个特殊数值,NaN有2个特点:
- 任何涉及NaN的操作都会返回NaN
- NaN与任何值都不相等,包括NaN本身
关于NaN的测试如下:
console.log(NaN / 10); //NaN console.log(NaN / 0); //NaN console.log(NaN == NaN); //false console.log(isNaN(NaN)); //true console.log(isNaN("")); //false console.log(isNaN(12)); //false console.log(isNaN("awd")); //true console.log(isNaN("awd12")); //true console.log(isNaN("12awd")); //true console.log(isNaN(null)); //false console.log(isNaN({})); //true console.log(isNaN({valueOf:function(){ //false,如果是对象则调用其valueOf方法,查看返回是否匹配NaN return -1; }})); console.log(isNaN({valueOf:function(){ //true return "awdw"; }}));
关于Number()函数:
Number()函数用于将一个非数值转换为数值类型,Boolean直接返回1或0,null返回0,undefined返回NaN,如果是字符串:空字符串返回0,非空返回去除前导0的字符值,比如"011"返回11,如果非数值字符串返回NaN,比如"this is test"返回NaN;如果是对象,则调用对象的valueOf方法返回。
关于Object类型:
创建:
var o = new Object();
Object的每个实例都有如下属性和方法:
- constructor:保存着用于创建当前对象的函数
- isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
- hasOwnProperty(propertyName):用于检查给定的属性是否在当前对象实例中
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in 语句枚举
- toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应
- toString():返回对象的字符串表示
- valueOf():返回对象的字符串、数值或布尔值表示
4、函数类型
ECMAScript的函数支持不定参数,实际上通过arguments对象即可直接获取请求的参数,函数定义时可以不用指定参数,使用时也可以传入任意数量参数:
function say(){ for(var i=0,len=arguments.length;i<len;i++){ console.log(arguments[i]); } } say(12,"343","1231");
function say2(name,age){ console.log(name); console.log(name == arguments[0]); console.log(age); console.log(age == arguments[1]); } say2("admin",23);
ECMAScript的函数不支持重载,如果定义了2个同名函数,则第二个会覆盖第一个函数:
function say(){ console.log(1111); } say(); //2222 function say(){ console.log(2222); } say(); //2222