重温《js权威指南》 第4、5、6章
第四章 表达式和运算符
4.2 对象和数组的初始化表达式
数组: [] [3,7] [1+2,3+4] [[1,2,3,],[4,5,6],[7,8,9]]
对象: {x:2.3,y:4.5}
4.4 属性访问表达式
js有两种属性访问方式 expression.identifier expression[expression]
4.8.1 "+"运算符
尽量转换为字符串再计算
4.9.1
== 相等运算符 === 恒等运算符
!= !==
"===" 严格相等运算符首先计算其操作数的值,然后比较这两个值(没有任何类型转换)
类型不同不相等
有NaN,不相等
0=-0
引用值指向同一个对象、数组或函数,相等
"==" 比较不严格,如果比较的不是同一类型,会尝试进行类型转换,转换规则如下:
一个字符串,一个数字,字符串尝试转换为数字再比较
如果有"true",则将其转换为1再进行比较
4.9.2 比较运算符
1.可以比较任何类型,但真正执行比较操作的只有数字和字符串,其他类型都转换成原始值
2.如果一个类型是数字,则原始值转换成数字
3.如果其中一个操作数是NaN,比较总返回false
4.字符串比较区分大小写 大写 < 小写
4.9.3 in运算符
左操作符是一个字符串或可以转换成字符串,有操作数是一个对象
若对象有字符串同名的属性名,则返回true
var point={x:1,y:1};
x in point;// true
z in point;// false
toString in point;// true 默认继承toString方法
4.9.4 instanceof运算符
做操作符是一个对象,右操作符标识对象的类
若对象是右侧类的实例,则返回true(会判断父类)
4.10
运算顺序自左向右
逻辑运算符会在任何希望使用布尔值的地方返回一个真值或假值,这也意味着逻辑运算符不一定只返回true,false。
var i=1&&2&&3;
alert(i);//3 因为运算顺序自左向右
4.12.1 eval()
eval最重要的是它使用了调用它的变量作用域环境
全局eval(),这种特性不仅保障了别名eval在函数作用域的安全性,还可以在函数中执行一些对上下文没有依赖的全局脚本代码段
var geval=eval;
var x="global",y=”global”;
function f(){
var x=”local”;
eval(”x+=’changed’”);
return x;
}
function y(){
var y=”local”;
geval("y+=’changed’”);
return y;
}
console.log(f(),x);
console.log(y(),y);
4.13.2 typeof运算符
一元操作符,返回操作数的类型
4.13.3 delete运算符
一元操作符,删除对象属性或者数组元素
第五章 语句
5.3 声明语句
多次声明同一个变量是无所谓的
第六章 对象
对象是个复合值,它将很多值聚合在一起,可通过名字访问这些值;对象也可看做是属性的无序集合,每个属性都是一个键值对。
javascript三类对象和两类属性:
内置对象:数组,函数,日期,正则表达式
宿主对象:js解释器所嵌入的宿主环境定义的。
自定义对象:js代码创建的对象
自由属性:直接在对象中定义的属性
继承属性:在对象的原型对象中定义的属性
6.1 创建对象
6.1.1 对象直接量
对象直接量是由若干键值对组成的映射表,属性名可以是标识符也可以是字符串直接量,属性值随意。
对象直接量是一个表达式,这个表达式每次运算都创建并初始化一个新的对象
6.1.2 通过new创建对象
关键字new后跟随一个函数调用,这个函数称作构造函数
6.1.3 原型
每一个js对象都和另一个对象相关联,“另一个对象”就是原型,每一个对象都从原型继承属性。
6.1.4 Object.create()
var i=Object.create({x:1,y:2});
var j=Object.create(Object.prototype);//相当于new Object()
var m=Object.create(null);//不继承任何属性和方法
function inherit(p){
if(p==null) throw new TypeError();if(Object.create) return Object.create(p);
var getType=typeof p;
if(p!='object'&&p!='function') throw new TypeError();
function f(){};
f.prototype=p;
return new f();
}
6.2 属性的查询和设置
object.property=object['property'];
在js中,只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关。属性赋值要么失败,要么创建一个属性,要么在原始对象中设置属性。
在非严格模式中,给一个只读的属性赋值,不会报错,属性也不会被修改。
6.3 delete属性
delete运算符可以删除对象的属性。
delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性
var a={p:{x:1}};
var b=a.p;// b指向 a.p
alert(delete a.p);//true
alert(a.p);//undefined
alert(b.x);//1 只是删掉了a.p的引用,但是b还是指向a.p。销毁对象时,要遍历属性中的属性,依次删除,防止内存泄漏
6.4 检测属性
可以通过in,hasOwnPreperty(),propertyIsEnumerable()方法来检测属性
in检测对象的自有属性或继承属性是否包含指定名称属性
hasOwnProperty()检测对象的自有属性是否包含指定名称的属性
var o={x:1};
"x" in o;// true
"y" in o;// false
"toString" in o;//true
o.hasOwnProperty('x');//true
o.hasOwnProperty('y');//false
o.hasOwnProperty('toString');//false
o.propertyIsEnumerable('x');//true
o.propertyIsEnumerable('y');//false
o.propertyIsEnumerable('toString');//false
6.5 枚举属性
for in
Object.keys()
Object.hasOwnPropertyNames();
6.6 属性getter和setter(ECMAScript5 后启用)
对象直接量方式创建
var test={
x:"asd",
get y(){return "get"+this.x;},//若不用this,则无法访问y
set y(value){ this.x=value;}
}
alert(test.x);
alert(test.y);
test.y="opq";
alert(test.y);
alert(test.x);
6.7 属性的特性
通过属性setter和getter的设置,可以实现属性的读、写、可枚举、可配置的特性
Object.getOwnPropertyDescriptor()可以获得某个对象特定的自有属性的属性描述,
Object.getOwnPropertyDescriptor({x:'1'},"x");
//返回 {value:1,writeable:true,enumerable:true,configurable:true}
Object.definePeoperty(),设置属性的特性,或者想让新建属性具有某种特性
var o={};
Object.defindePeoperty(o,"x",{value:"abc",writeable:true,enumerable:false,configurable:true});
o.x;//1 有值
Object.keys(o)// {} 不可枚举
Object.definePeoperty(o,"x",{enumerable:true});
Object.keys(o)//{x:"abc"}
Object.definePeoperties(), 可以设置多个属性的版本
若给不可创建或修改的属性使用definePeoperty,会报错
/*不可枚举的extend()方法
*
*/
Object.definePeoproty(Object.prototype,"extend",{
writeable:true,
enumerable:true,
configurable:true,
value:function(o){
var names=Object.getOwnpropertyNames(o);
for(var i=0;i<names.length;i++)
{//若属性已存在,则跳过
if(names[i] in this)continue;
var desc=Object.getOwnPropertyDescriptor(o,names[i]);
Object.defineProperty(this,names[i],desc);
}}
});
6.8 对象的三个属性
6.8.1 原型属性
创建:
对象直接量,使用Object.prototype作为原型
new,使用 构造函数的prototype作为原型
Object.create(),使用 传入的第一个参数作为原型
查找:
Object.getPrototypeOf()//ECMAScript 5
o.constructor.prototype//ECMAScript 3
6.8.2 类属性
对象的类属性是一个字符串,用以表示对象的类型信息
function (){
if(o===null) return "Null";
if(o===undefined) return "undefined";
return Object.prototype.toString.Call(o).slice(8,-1);
}
6.9 序列化对象
JSON.stringify();
JSON.parse();
注:ECMAScript 5中的这些函数的本地实现和http://json.org/json2.js 基本一样,所以可以引入json2.js在ECMAScript的环境中使用这些函数
重温《js权威指南》 第4、5、6章的更多相关文章
- 《JS权威指南学习总结--第8章 函数知识》
内容要点: 1.函数表达式定义后立即调用: var tensquared = ( function(x){ return x*x ;}(10) ); 2.嵌套函数: 在JS里,函数可以嵌套 ...
- 《JS权威指南学习总结--第7章 数组》
内容要点: 一. JS数组是无类型的:数组元素可以是任意对象,并且同一个数组中的不同元素也可能有不同的类型.数组的元素甚至也可能是对象或其他属性,这允许创建复制的数据结构,如对象的数组和数组的数组. ...
- 《JS权威指南学习总结--第六章 对象》
内容要点: 一.对象定义 对象是JS的基本数据类型.对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 对象也可看做是属性的无序集合,每个属性都是一个名/值对. 属性 ...
- 《JS权威指南学习总结--第五章语句》
内容要点: 一.throw语句 所谓异常是当发生了某种异常情况或错误时产生的一个信号. 抛出异常就是用信号通知发生了错误或异常状况. 捕获异常时指处理这个信号,即采取必要的手段 ...
- 《JS权威指南学习总结--第三章类型、值和变量》
第三章 类型.值和变量 内容要点 一.数据类型 1.在编程语言中,能够表示并操作的值的类型称做数据类型 2.JS的数据类型分为两类: 原始类型:数字.字符串和布尔值 对象类型 3.JS中有两个特殊的原 ...
- 《JS权威指南学习总结--第7章 数组概念、稀疏数组》
一.数组概念 数组是值的有序结合.每个值叫做一个元素,而每个元素在数组中都有一个位置,用数字表示,称为索引. JS数组是无类型的:数组元素可以是任意对象,并且同一个数组中的不同元素也可能有不同的类型. ...
- 《JS权威指南学习总结--第四章4.9.1相等和严格相等》
内容要点: 一. 严格相等运算符"===" 首先计算其操作数的值,然后比较这两个值,比较过程没有任何类型转换: 1.如果两个值类型不同,则它们不 ...
- 《JS权威指南学习总结--1.1语言核心》
1.1语言核心 --本节主要介绍<js权威指南>基础部分各章讲解内容和一些简单的示例 本小节内容: 一.第二章讲解js注释.分号和Unicode,第三章主要讲解js变量和赋值 简单示例: ...
- 【vue.js权威指南】读书笔记(第一章)
最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ...
- 《JS权威指南学习总结》
JS权威指南学习总结:http://www.cnblogs.com/ahthw/category/652668.html
随机推荐
- kafka中server.properties配置文件参数说明
转自:http://blog.csdn.net/lizhitao/article/details/25667831 参数 说明(解释) broker.id =0 每一个broker在集群中的唯一表示, ...
- SQL中一种类似GUID值的函数实现
开发中会需要用到多列值组合成一个ID值的情况.比如做数据清洗的时候,一张表A有五列,分别是医院.科室.医生.职称.电话.面有许多重复的数据需要和另一个表B(和A列相同)做对比.清洗需要做两件事 ...
- 查看BADI有哪些实现
TCODE:SE18
- [shell基础]——算术运算
shell只支持整数运算.一般可用let.expr.declare.$[]实现. 更精准的运算建议使用Linux下的bc工具——一款高精度计算语言. 1. let是shell内建的整数运算命令 ## ...
- DF与EF的区别
DF:专有文件 EF:基本文件 1.EF没有文件名,只有FID(文件标识符) 2.DF有文件名,又有FID,因此COS可以根据文件名来访问DF
- oracle关于分区相关操作
[sql] view plaincopy 1.查询当前用户下有哪些是分区表: SELECT * FROM USER_PART_TABLES; 2.查询当前用户下有哪些分区索引: SELECT * FR ...
- linux free 命令
命 令: free 功能说明:显示内存状态. 语 法: free [-bkmotV][-s <间隔秒数>] 补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共 ...
- pspo
一.项目计划总结: 周活动总结表 姓名: 日期:3.12.2015 日期 任务 听课 编写程序 阅读课本 准备考试 日总计 周日 周一 周二 周三 10:00- ...
- php7+apache的环境安装配置
因为刚开始接触php,所以要对php的开发环境进行搭建. 1.首先到Apache的官网下载最新版: http://httpd.apache.org/download.cgi: 参照该网址配置Apach ...
- short-path problem (Dijkstra) 分类: ACM TYPE 2014-09-01 23:51 111人阅读 评论(0) 收藏
#include <cstdio> #include <iostream> #include <cstring> using namespace std; cons ...