"JavaScript一切皆对象"的说法,实际上是JavaScript编程语言的一个核心特性和设计理念。在JavaScript中,几乎所有的东西都可以被看作是一个对象,包括基本数据类型(如数字、字符串、布尔值)和复杂的数据结构(如数组、函数)等。
下面是关于这些概念的理解:
1,基本数据类型也是对象:在JavaScript中,基本数据类型如Number、String、Boolean都有对应的包装对象。当对这些基本数据类型的值调用方法时,JavaScript会自动将它们转换为对应的包装对象,然后调用该方法。例如,你可以对字符串使用toUpperCase()方法,尽管字符串本身并不是对象。
//string类型
let str = "Hello, World!";
console.log(str.toUpperCase()); // 输出 "HELLO, WORLD!"
console.log(str.substr(1,3))//ell
//Number类型
let num1 = 42;
console.log(num1.toString()); // 输出 "42"
//boolean类型
let bool = true;
console.log(bool.toString()); // 输出 "true"
其它上面第一个string类型的等于以下的写法,后面两个number类型和boolean类型的也一样
<script>
let obj=new Object('Hello, World!')
console.log(obj.toUpperCase())//HELLO, WORLD!
console.log(obj.substr(1,3))//ell
</script>
2,函数也是对象:在JavaScript中,函数是一等公民,它们可以像其他任何值一样被传递和操作。函数在JavaScript中实际上是一种特殊的对象,它们有属性和方法,也可以被赋值给变量或作为参数传递给其他函数。
function greet(name) {
return `test, ${name}!`
}
// 函数作为对象,可以拥有属性
greet.greeting = "Welcome";
greet.age="100"
console.log(greet.greeting); // Welcome
console.log(greet.age)//100
// 函数被赋值给变量
let sayHello = greet;
console.log(sayHello("JavaScript")) // 输出 test, JavaScript!
3,数组和对象:数组和对象在JavaScript中显然是对象。数组是带有数字索引的特殊对象,而普通的对象则是由键值对组成的。
// 这里可以直接调用数组常用的方法push,pop,map等
let arr = [1, 2, 3];
arr.push(4); // 使用数组的方法
console.log(arr); // 输出 [1, 2, 3, 4]
// 对象作为对象
let obj = {
name: "李四",
age: 30,
greet: function() {
console.log(`我叫 ${this.name}`);
}
};
obj.greet(); // 调用对象的方法
console.log(obj.name,obj.age); //李四 30
4,原型链和继承:JavaScript使用原型链来实现继承。每个对象都有一个指向它的原型(prototype)的链接,而原型本身也是一个对象,也可以有自己的原型。这样,就形成了一个原型链。当试图访问一个对象的属性时,如果对象本身没有这个属性,那么JavaScript会沿着原型链向上查找。
// 创建一个构造函数
function Person(name) {
this.name = name;
}
// 为Person的原型添加一个方法
Person.prototype.greet = function() {
console.log(`test ${this.name}`);
};
// 创建一个新的对象,继承自Person
let alice = new Person("赵六");
alice.greet(); // test 赵六
// 对象的__proto__等于原型prototype
console.log(alice.__proto__ === Person.prototype); // 输出 true
总结:javaScript除null和undefined以外都是以原型链的形式直接或间接继承自Object