2016年4月26日

[TOC]

2016年4月26日

javascript

对象

所谓对象,就是一种无序的数据集合,由若干个“键值对”(key-value)构成。 对象的所有键名都是字符串,所以加不加引号都可以。

  • 如果键名不符合标识名的条件(数字、空格或者运算符),也不是数字,则必须加上引号。

  • JavaScript的保留字可以不加引号当作键名。

  • 如果键名是数字,则会默认转为对应的字符串。

'1p': "Hello World",

for: 1,

1e2: true//100: true

对象生成

var o1 = {};
var o2 = new Object();
var o3 = Object.create(null);

操作属性

读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。

var o = {
  p: 'Hello World'
};

o.p // "Hello World"
o['p'] // "Hello World"

如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。但是,数字键可以不加引号,因为会被当作字符串处理。

if(a) {...} // 报错

if(window.a) {...} // 不报错
if(window['a']) {...} // 不报错

if('a' in window) {//推荐 使用
  ...
}

所有全局变量都是window对象的属性。如果该属性不存在,就返回undefined,并不会报错。

查看所有属性

var o = {
  key1: 1,
  key2: 2
};

Object.keys(o);
// ['key1', 'key2']

删除属性

var o = {p: 1};
Object.keys(o) // ["p"]

delete o.p // true
o.p // undefined
Object.keys(o) // []

一旦使用delete命令删除某个属性,再读取该属性就会返回undefined,而且Object.keys方法返回的该对象的所有属性中,也将不再包括该属性。

对象的引用

如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。

var o1 = {};
var o2 = o1;
//o1和o2指向同一个对象,因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。
o1.a = 1;
o2.a // 1

o2.b = 2;
o1.b // 2
var o1 = {};
var o2 = o1;

o1 = 1;
o2 // {}

o1和o2指向同一个对象,然后o1的值变为1,这时不会对o2产生影响。

in运算符

in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。

var o = { p: 1 };
'p' in o // true

在JavaScript语言中,所有全局变量都是顶层对象(window)的属性。 in运算符的一个问题是,它不能识别对象继承的属性。

var o = new Object();
o.hasOwnProperty('toString') // false

'toString' in o // true

hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。

for…in循环

for...in循环用来遍历一个对象的全部属性。 for...in循环遍历的是对象所有可enumberable的属性,包括对象本身的属性,还包括对象继承的属性

// name 是 Person 本身的属性
function Person(name) {
  this.name = name;
}

// describe是Person.prototype的属性
Person.prototype.describe = function () {
  return 'Name: '+this.name;
};

var person = new Person('Jane');

// for...in循环会遍历实例自身的属性(name),
// 以及继承的属性(describe)
for (var key in person) {
  console.log(key);
}
// name
// describe

如果只想遍历对象本身的属性,可以使用hasOwnProperty方法:

for (var key in person) {
  if (person.hasOwnProperty(key)) {
    console.log(key);
  }
}
// name

with语句

它的作用是操作同一个对象的多个属性时。

// 例一
with (o) {
  p1 = 1;
  p2 = 2;
}
// 等同于
o.p1 = 1;
o.p2 = 2;

// 例二
with (document.links[0]){
  console.log(href);
  console.log(title);
  console.log(style);
}
// 等同于
console.log(document.links[0].href);
console.log(document.links[0].title);
console.log(document.links[0].style);

with区块内部的变量,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量。

var o = {};

with (o) {
  x = "abc";
}

o.x // undefined
x // "abc"

数值

两个字符串进行比较时,按照字典顺序进行比较。 JavaScript引擎内部首先比较首字符的Unicode编号,如果相等,再比较第二个字符的Unicode编号,以此类推。

'cat' > 'Cat' // true'

小写的c的Unicode编号(99)大于大写的C的Unicode编号(67)。

同一类的复合类型值

两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。

({}) === {} // false
[] === [] // false
(function (){}) === function (){} // false

严格相等运算比较的是它们的内存地址是否一样,而上面代码中空对象、空数组、空函数的值,都存放在不同的内存地址,结果当然是false。

相等运算符

  • 原始类型的值

    • 原始类型的数据会转换成数值类型再进行比较。

  • 对象与原始类型值比较

    • 对象(这里指广义的对象,包括数值和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。

[1] == 1 // true
[1] == '1' // true
[1] == true // true

上面代码将只含有数值1的数组与原始类型的值进行比较,数组[1]会被自动转换成数值1,因此结果都是true。

  • undefined和null

    • undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。

  • 相等运算符的缺点

    • 相等运算符隐藏的类型转换,会带来一些违反直觉的结果。

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

布尔运算符

取反运算符形式上是一个感叹号,用于将布尔值变为相反值。

以下六个值取反后为true:

!undefined // true
!null // true
!false // true
!0 // true
!NaN // true
!"" // true
!!x

// 等同于

Boolean(x)

且运算符(&&)

如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值。

"t" && "" // ""
"t" && "f" // "f"
"t" && (1+2) // 3
"" && "f" // ""
"" && "" // ""

且运算符可以多个连用,这时返回第一个布尔值为false的表达式的值。

或运算符(||)

如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false,则返回第二个运算子的值。

"t" || "" // "t"
"t" || "f" // "t"
"" || "f" // "f"
"" || "" // ""

或运算符可以多个连用,这时返回第一个布尔值为true的表达式的值。

三元条件运算符( ? :)

三元条件运算符用问号(?)和冒号(:),分隔三个表达式。如果第一个表达式的布尔值为true,则返回第二个表达式的值,否则返回第三个表达式的值。

"t" ? true : false // true

0 ? true : false // false

位运算

http://javascript.ruanyifeng.com/grammar/operator.html#toc14

圆括号运算符

圆括号是一种运算符,它有两种用法:如果把表达式放在圆括号之中,作用是求值;如果跟在函数的后面,作用是调用函数。

对象放在圆括号之中,则会返回对象的值,即对象本身。

var o = {p:1};

(o)
// Object {p: 1}

void运算符

void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。

void运算符的优先性很高

<a href="javascript:void(f())">文字</a>

//下面的代码会提交表单,但是不会产生页面跳转。

<a href="javascript:void(document.form.submit())">
文字</a>

逗号运算符

逗号运算符用于对两个表达式求值,并返回后一个表达式的值。

"a", "b" // "b"

var x = 0;
var y = (x++, 10);
x // 1
y // 10

运算顺序

赋值运算符(=)和三元条件运算符(?:)是少数运算符的计算顺序是从右到左。

w = x = y = z;
q = a ? b : c ? d : e ? f : g;

w = (x = (y = z));
q = a ? b : (c ? d : (e ? f : g));

下表按从最高到最低的优先级列出JavaScript运算符。

运算符

描述

. [] ()

字段访问、数组下标、函数调用以及表达式分组

++ -- - ~ ! delete new typeof void

一元运算符、返回数据类型、对象创建、未定义值

* / %

乘法、除法、取模

+ - +

加法、减法、字符串连接

<< >> >>>

移位

< <= > >= instanceof

小于、小于等于、大于、大于等于、instanceof

== != === !==

等于、不等于、严格相等、非严格相等

&

按位与

^

按位异或

|

按位或

&&

逻辑与

||

逻辑或

?:

条件

= oP=

赋值、运算赋值

,

多重求值

Last updated