格式:最好写单引号,后端是双引号
一. 构造函数中的this
1. this指向
不管在什么情况下,只要通过new被实例化出来的对象,该函数里面的this一定指向该对象,一定不会指向构造函数本身
如果没有new 进行实例化 那么this指向window
2. this是怎么来的
26.00
/当Car 被new实例化的时候 就相当于普通函数(function Car(..))被执行的时候,
/只要一执行,AO产生,自动先保存this,this赋值空对象:
/AO = {
/ this:{}
/}
function Car(color,brand){
/this = {
/color:color,
/brand:brand;
/}
this.color = color;
this.brand = brand;
}
var car1 = new Car('red','benz');
console.log(car1.color);
new仅仅是把this造出来。
只要一执行,AO产生,自动先保存this,this赋值空对象
1.声明car1,生成GO,里面存储car1、以及Car函数
2.函数执行、生成AO、this
3.括号里面的red、Bendz等实参 传递到AO里面,被this接收
4.构造函数中 还会隐式返回this。
5.返回的 this 被 car1 接收
把this换成随便一个参数 也能验证了这点:
3.return this
故意return 引用值 返回引用值
故意return 原始值 返回应该返回的值
二.包装类
原始值没有自己的方法和属性
原始值要想有自己的方法和属性,就必须变成包装类
数字对象、实例化对象后的数字
任意的给它设置属性跟方法,当一个数字经过了new Number()了以后,它就会变成一个对象,成为一个对象了以后,理所当然的就能给它设置属性跟方法
经过new Number()包装了以后,再参与运算 (对象居然能和数字相加),它又会返回到原始值
1.undefined、null不能设置任何属性跟方法
undefined、null不能设置任何属性跟方法 因为undefined、null属于原始值.而且undefined非数、非string、非Boolean。
null是特殊原因:对象类型为object,但是Number()后结果为0.所以暂时不设置null的包装类
var test = new Number(null)// Number {[[.....]]:0}
var test = new String(null)// String {[[.....]]:"null"}
var test = new String(undefined)//String {[[.....]]:"undefined"}
console.log(test)
console.log(undefined.length)//报错
console.log(null.length)//报错
2.JS包装类
原始值后面不能加属性和方法,但是我非要加,系统会做出响应:
隐式使用new Number() 将原始值变成数字对象
var a = 123;
a.lenth = 3;
/系统做出响应:new Number(123).lenth = 3;
/创建了上面这个 但是没地方保存 只能把它删掉:delete 属性
console.log(a.length);//undefined
我们可以手动设置一个变量保存它:这样才能拥有属性而不丢失,这就是JS的包装类
var a = new Number(123);
a.length = 3;
console.log(a.length);//输出3
因为new Number(123)是包装类,已经是一个对象了。
- string类型可以length
var str = 'abc';
console.log(str.length)//3
系统内部的隐式操作:
var str = 'abc';
/new String(str).length
/而此时字符串有自带的length属性
console.log(str.length) //就相当于console.log(new String(str).length) 所以输出3
new String(str).length,但是没有存放它的变量,自行销毁
而此时字符串有自带的length属性
就相当于console.log(new String(str).length)
数组有截断方法:
var arr = [1,2,3,4,5];
arr.length = 3;
console.log(arr); //输出 (3)[1,2,3]
//只输出前三位
输6,会增加一个空位
arr.length = 6;
console.log(arr); //(6) [1,2,3,4,5,empty]
字符串没有截断
var str = 'abc'
str.length = 1; /系统隐式操作:new String(str).length = 1
/赋值了 但没地方保存 只能delete 全部删除
console.log(str.length); /到这步时 出现str.length 系统重新new String(str).length
/输出3
三.本节课知识 及相关案例
1.
最终输出undefined
因为没地方存放type.text = "string'
最终删除,而字符串没有text属性
2.
<script>
function Test(a, b, c) {
var d = 1;
function f() {
d++;
console.log(d);
}
this.g = f;
}
var test1 = new Test();
test1.g();
test1.g();
var test2 = new Test();
test2.g();
</script>
输出2,3,2
test1 = new Test()过程中 隐式执行return this,形成闭包:在test1里面执行一次2,再执行一次3;
test2 = new Test() 创建了另一个对象 与test1互不想干
3
同样的函数名,造成了覆盖
四. ASCII码
表1:0-127 , 表2: 128-255;
所有字符都是占一个字节 (byte)
Unicode码 涵盖ASCII码 之后中文韩文之类的字符:
256位开始两个字节
在Unicode中查出字符对应的编码:
var str = 'abc'
var pos = str.charCodeAt(0);
console.log(pos); //输出97 字符a对应的Unicode编码
五. 实战
写一个函数,接收任意一个字符串,算出这个字符串的总字节数(编码总和)