"JavaScript构造函数与JSON格式转换及对象操作"
在JavaScript中,构造函数是一种特殊类型的函数,主要用于创建和初始化对象。它们在定义时与其他函数并无显著差异,但调用方式上有所不同。构造函数通常通过`new`关键字来调用,这时它会执行以下操作:
1. 创建一个新的空对象。
2. 将新对象的`__proto__`属性指向构造函数的`prototype`对象。
3. 设置构造函数内部的`this`关键字指向新创建的对象。
4. 执行构造函数中的代码,初始化新对象的属性和方法。
5. 如果构造函数没有显式返回对象,那么默认会返回新创建的对象。
创建JavaScript对象有多种方式,包括:
1. 使用`new`运算符和构造函数,如`new Object()`。
2. 字面量语法,使用大括号`{}`定义对象。
3. 工厂模式,通过自定义函数创建对象。
4. 构造函数模式,通过构造函数创建实例。
5. 原型模式,通过修改对象的`prototype`属性实现对象间的继承。
6. 构造函数+原型模式,结合了前两者,更灵活地处理对象的创建和继承。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集。在JavaScript中,可以使用`JSON.stringify()`方法将对象转换为JSON格式的字符串,例如:
```javascript
var obj = {
a: "a",
b: "b"
};
var str = JSON.stringify(obj);
console.log(str); // 输出:"{\"a\":\"a\",\"b\":\"b\"}"
```
反过来,若要将JSON字符串解析为JavaScript对象,可以使用`JSON.parse()`方法:
```javascript
var str = "{\"a\":\"a\",\"b\":\"b\"}";
var obj2 = JSON.parse(str);
console.log(obj2); // 输出:{a: "a", b: "b"}
```
在JavaScript中,可以使用`call()`, `apply()`, 和 `bind()`这三种方法来改变函数中`this`的指向:
- `call()`方法允许你指定一个对象,并将该对象作为上下文(即`this`)来执行函数。参数列表以逗号分隔。
- `apply()`与`call()`类似,但传递参数的方式不同,它接受一个数组或类数组对象作为参数。
- `bind()`方法不会立即执行函数,而是返回一个新函数,新函数的`this`被绑定到指定的对象,不论在哪调用这个新函数,`this`值都不会改变。
例如,改变`this`指向来计算字符串中字符出现的次数:
```javascript
function countChars(str) {
var counts = {};
for (var i = 0; i < str.length; i++) {
if (counts[str[i]]) {
counts[str[i]]++;
} else {
counts[str[i]] = 1;
}
}
return counts;
}
var str = "aacdfaeebcddc";
countChars.call(null, str); // 返回字符计数的对象
```
在JavaScript中,可以设计一个函数,使得`sum(2,3,4)`和`sum(2)(3)(4)`都能得到相同的结果9。这种技巧通常涉及到闭包和递归调用:
```javascript
function sum(a) {
var result = a;
function inner(b) {
result += b;
return inner;
}
inner.valueOf = function() {
return result;
};
return inner;
}
console.log(sum(2)(3)(4)); // 输出:9
console.log(sum(2, 3, 4)); // 输出:9
```
关于题目中的最后一个表达式`var n = null; console.log(n ? 1 : 2);`,由于`null`是 falsy 值之一,因此条件判断表达式`n ? 1 : 2`的结果将是第二个值,即2。所以,这段代码会打印出2。