《JAVASCRIPT:THE COMPLETE REFERENCE》读书笔记 数据类型与变量
5+3数据类型
-
5种基本数据类型
- 数字 number 包含整数(int),浮点数(float),计算错误(NaN),特殊值(infinity/-infinity/-0)
- 字符串 string 包含所有字符组成的串
- 布尔 boolean 只有两个值true和false
- 未定义 undefined 当一个标识符并未被声明或声明的变量未赋值或数组某个值未被赋值
- 空类型 null 当一个对象被指定为空时或外部引用了一个错误的对象
-
2种复合类型
- 对象 object 一个包含属性,方法的复合类型。
- 数组 array 包含可用顺序索引或名称索引的数据的组合。
-
1种复杂类型函数
- 函数 function 由参量,语句和返回值构成的独特的类型。
数据类型的转化
- JAVASCRIPT是弱类型,数据类型的转化分为两种
- 显式转化
见表2-4 类型转换方法,P41
- 隐式转化
见表2-3 JavaScript中的类型转换,P40
- 显式转化
数据声明的方式
-
字面值风格
var function test(x,y,z){z=x+y;return z;}
var a=1;
var words='abc';
var arr=['A','B','C'];
-
类型风格
var test= function(x,y,z){z=x+y;return z;}
var a;a=1;
var words;words='abc';
var arr;arr=['A','B','C'];
-
对象风格
var test= new Function(‘x’,‘y’,‘z’,‘{z=x+y;return z;}’);
var a=new Number(1);
var words=new String('abc');
var arr=new Array(3);/var arr=new Array('A','B','C');
对象的几种创建方法
- 包装法
var myObject={};
myObject.name="Tino";
myObject.fly=function(){fly();}
- 对象法
var myObject=new Object();
myObject.name="Tino";
myObject.fly=function(){fly();}
- 函数法
function GeObject(name){
this.name=name;
this.fly=function(){fly();}
}
var myObject=new GeObject("Tino");
- 原型法
function GeObject(){};
GeObject.prototype.name='';
GeObject.prototype.fly=function(){fly();}
var myObject=new GeObject;
myObject.name='Tino';
- 函数原型混合法(属性在函数体内写明,方法用原型添加)
function GeObject(name){
this.name=name;
}
GeObject.prototype.fly=function(){fly();}
var myObject=new GeObject("Tino");
标识符命名方法和要求
- JavaScript程序员建议使用驼峰式命名法(Camel-Case)。
- 小驼峰法:变量myStudentCount第一个单词是全部小写,后面的单词首字母大写。用于一般变量。
- 大驼峰法:变量MyStudentCoun所有首字母大写。用于对象原型。
- 全大写法:MYSTUDENTCOUNT所有字母大写。用于全局常量。
- 下划线法:_myStudentCount。用于局部变量,防止对全局变量的屏蔽。
作用域
定义解释
- 作用域scope:程序中变量可见的代码段。
- 全局变量global:在程序任何地方可见。
- 局部变量local:在特定上下文中可见。
- 上下文context:构成执行环境的定义的数据集合。
工作方式
- 当调用函数时,解释器为函数执行期间创建一个新的局部上下文。在该函数中声明的变量在这个上下文中,函数返回时销毁这个上下文。
- 在函数中引用变量时,解释器首先在局部上下文中找。如果找不到,就递归地在包装中寻找一直到全局上下文。再找不到就报错。
三个微妙的注意点
- 每一个浏览器都有自己的上下文,JS允许通过访问框架和其他具有名称的窗口,称为跨窗口交互。
- 在一个函数中,不管在什么位置声明变量,它在函数第一条语句运行前就存在上下文中。但是,它的初始化和赋值在其语句运行后才有效。
- 在任何位置调用函数,那个函数的作用域都是它在创建时的作用域,称为静态作用域。所以建议所有函数内部需要的数据都以参量的形式传入,以免出现困惑。
一些JavaScript语言的注意事项
- 永远不要直接比较浮点数的相等性。
- 当整数超出了-253~253时,数字值将会变成不准确的约数。
- 双引号和单引号可以也必须交叉相互嵌套。
-
造成NaN的情形:
- 计算不满足计算符的要求:
- 0/0
- Math.sin(Infinity); Math.sin(-Infinity);
- Infinity+Infinity; Infinity-Infinity;
- Math.sqrt(-2)
- Math.log(-1)
- 转换成数据类型的参数不满足要求
- parseFloat(‘foo’)
- 计算不满足计算符的要求:
数据前导数0x代表十六进制,前导数0代表八进制。
- 即使不用对象法声明数组、字符串,依然可以使用Array、String对象的方法。如“abc”.charAt(2);//c
- “\”用于引号内部特殊符号的转义。常用的转义符号见表3-3,P84。
- 请将换行,多个空格,制表符等放在预格式化标签内< pre >。
-
“use strict”; 严格模式,推荐新手使用。他的规则有:
- 不允许为之前没有声明过的变量赋值。也就是不允许在函数内部添加全局变量。
- 试图删除不能被删除的内容时会报错。例如尝试去删除var关键词声明的变量。
- eval不能重新赋值、重写,或用作变量与属性的名称,也不能向这个作用域引入新变量。
- 禁止使用with。
“==”是值相等;“===” 是值与类型同时相等。
- NaN是唯一一个与自己不等的数据。NaN!=NaN.
- NaN==undefined;NaN!==undefined;//true.
- (expr1?expr2:expr3)三元运算符在JS中可用。
- “+”运算符优先对字符串进行字符串组合操作。
- 永远不要使用隐式分号法。
- 永远不要使用隐式声明法。
- JS是区分大小写的,html却不区分并建议使用全小写。所以在一份html文件中要分清哪里是JS代码区哪里是标记语言区。