- Javascript的简单类型包括
1.数字 number
JS不分整型与浮点型
俩个浮点数相加,精度不够
2.字符串 string
字符串+数字最后还是会变成字符串
字符串与字符串相连用+号运算符
字符串是不可改变的,一旦字符串被创建,就无法改变。但可以运用+号运算符连接其他的字符串,从而得到新的字符串。
字符串数字等,就如同java,c语言等的对象,拥有一些的方法。
3.布尔值 boolean
4.null
5.undefined
以上都是简单数据类型
其他都是对象Function(函数) Array(数组)都是对象
研究一下 前五个貌似是对象,因为他们拥有方法,但是但没事不可变的
简单数据类型,不是对象?
-Javascript的对象字面量:
对象字面量是花括号包含零或多个“键:值”对。并且允许出现在任何允许表达式出现的地方。
1:对象是可嵌套的。
例:
var student={
name:"龙傲天",
sex:"男",
hobby:"打豆豆",
teacher:{
chinese:"鲁迅",
math:"六六六"
}
};
2:检索字符串可以用 []或 . 进行检索,不过推荐用.进行检索
例: student.teacher.chinese //鲁迅
或: student["name"]
1.若检索未定义的键值,则会返回undefined基础类型,若检索undefined值则会在浏览器报错
依旧是上面的例子,
检索:student.friend 会返回未定义 undefined
若检索:student.friend.name 则会报错
解决方法 student.friend && student.friend.name 通过&&运算符避免错误。
2.若对对象中的数值进行增加或更改,同样使用[]或 .进行更改。
例:
student.name='凤傲天';
student.num=1008611;
或: student['name'] ='凤傲天'
student['num']=1008611;
3.对象可以引用传值:
例如:
var x=student;
x.num=10086;
var num= student.num;
nnn=12345678;
. 每次传递的是引用,改变nnn的值并不会影响到对象student的值
4.对象不能直接复制。
例:var student1= student //
student1.name="凤傲骄"
最后student.name也变成了凤傲骄
我们希望拷贝一份 student的属性给 studen1,赋值是最简单的做法,但是这并不是我们想要的结果。 因为这仅仅是将student , student1指向了同一对象,修改其一,会相互影响.
怎么解决呢? 对象浅拷贝:
var student1= {};
for (var key in student) {
student1[key] = student[key];
}
student1.name="凤傲骄";
创建空对象,用循环依次给与相同的键值,类似于java语言。
3:原型创建对象(new Object()):
// 使用new Object()构造对象创建对象
var person = new Object();
// 给person对象添加属性
person.name = "jacke";
person.age = 18;
person.play = function(){
console.log("爱好打羽毛球");
};
// 调用对象
console.log(person); // {name: "jacke", age: 18, play: ƒ}
person["play"](); // 爱好打羽毛球
注意:用原型创建的对象不能进行更改,若要对对象进行更改,应避免使用原型。
原型链:原型链类似于java当中的类,能够保证对象之间的联系。
原型初次认识:
1.原型中的customer指向实例,而实例的prototype指向原型。每个对象都有一个_proto_属性,指向创建该对象的函数的prototype。
1原型拥有constructor和proto属性,constructor指向它的那个构造函数,而proto用来储存被自己用作构造函数的对象,也就是说构造函数和原型对象是互相指向的关系。
2 若一个原型拥有构造函数实例的过程,就会拥有prototype属性,这个属性能够储存同一的方法,避免用原型构建不同对象时候,不同对象拥有同一方法需要多次声明,只需要从原型中的prototype直接提取。
例如
function Dog(name, color)
{ this.name = name
this.color = color
this.bark = () => { console.log('wangwang~') } }
const dog1 = new Dog('dog1', 'black')
const dog2 = new Dog('dog2', 'white')
创建了俩只不同的狗对象dog1,dog2他们拥有不同的名字和颜色,但是方法(也就是行为)是大致相同的,若每次构造对象,都重新创建这个方法,那么会大量浪费。因此js会将方法单独放在一原型的prototype中,并且让所有用原型的构造函数构造的来允许访问其prototype的值。
因此可以对上述代码进行优化:
function Dog(name, color) { this.name = name this.color = color }
Dog.prototype.bark = () => { console.log('wangwang~') }
3.原型对象就是用来存放实例中共有的那部分属性。
4.在JavaScript中,所有的对象都是由它的原型对象继承而来,反之,所有的对象都可以作为原型对象存在。
5.访问对象的属性时,JavaScript会首先在对象自身的属性内查找,若没有找到,则会跳转到该对象的原型对象中查找。
引用自:作者:cicec
链接:https://juejin.cn/post/6844903567375990791
来源:掘金
var stooge = {
"first-name": "Jerome",
"last-name": "Howard"
};
stooge['middle-name'] = 'Lester';
stooge.nickname = 'Curly';
//以上填充4个元素
if (typeof Object.beget !== 'function') {
Object.beget = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
var another_stooge = Object.beget(stooge);
another_stooge['first-name'] = 'Harry';
another_stooge['middle-name'] = 'Moses';
another_stooge.nickname = 'Moe';
//以上填充3个元素
stooge.profession = 'actor';
//原型填充1个元素:因为本身another_stooge没有这个属性,所以到原型去寻找
another_stooge.profession // 'actor'<br />
//如果本身有这个属性,就取这个属性
another_stooge.nickname // 'Moe'
delete another_stooge.nickname;
another_stooge.nickname; // 'Curly'
var another_stooge = Object.beget(stooge);运用原型创建的对象another_stooge,分别对first-name,middle-name赋值(原型中有的),并新增了一个nickname属性。
another_stooge.profession 当本身没有这个属性时,就会从原型查找,依次类推,直至终点,也就是所有对象的原型Object.prototype.如果没有查到,值便是undefined。
若本身如果本身有这个属性,就取这个属性
若删除了本身的属性,但是原型还有其属性,那么就会返璞归真,属性值会变为原型值,本身属性直接删除。