构造函数和实例化原理
function Car(color,brand) {
// var this = {
// 隐式定义了this;
// }
this.color = color;
this.brand = brand;
//return this;隐式返回了this
}
var car = new Car('red','BMW');
console.log(car.color);
GO = {
car:undefined,
Car :function(){....}
}
AO = {
this:{
color:color,
brand:brand
}
//实例化的时候产生了this;
}
- new 改变了this指向,将this 指向改为指向实例化对象。
模拟构造函数
function Car(color,brand){
var me = {};//类似 this;
me.color = color;
me.brand = brand;
return me;//这里显示返回me 构造函数是隐式返回this;
}
构造函数中的return引用值类型就会覆盖原来的this,return 原始值类型则不会覆盖
function Test(opt){
this.name =opt.name;
return undefined;//无效
return null;//无效
return 1,//无效
return false,//无效
return '1'//无效
}
var t = new Test({name:1})
console.log(t.name)//1
function Test(opt){
this.name =opt.name;
return {};//有效
return [];//有效
return /{abc}/g//有效
return new Date();//有效
}
var t = new Test({name:1})
console.log(t.name)//undefined
JS包装类
- 原始值没有自己的属性和方法
new Number() new String() new Boolean();
var a = 1;
var b = new Number(a);
b.len = 3;
b.add = function(){
console.log(1);
}
console.log(b);//{len:3,add:function(){...}}
例子2var a = 123;
a.len = 3;
console.log(a.len)//undefined
/**系统操作
* //new Number(123).len = 3; delete a.len;
* 类似于
* var obj={};
* obj.name=3;
* delete obj.name;
* console.log(obj.name);
*/
一个数字经过new Number()之后就变成数字对象。数字对象参与运算之后又回归的原始值。
- undefined,null 不能有属性和方法 undefined.len=3;null.len=3???//报错、
字符串包装类有length 属性。原型值是没有方法和属性的
undefined.length//报错。
null.length//报错
var a = new String('123');
当给原始值添加属性或者方法的时候,系统会使用js包装类.但是系统无法保存 这个属性或方法。所以就删除了这个属性。
- 字符串的length ```javascript var str = ‘abc’; console.log(str.length);//3 console.log(new String(str).length);//3
var str = ‘abc’; str.length=1;//new String(str).length=1; delete new String(str).length console.log(str.length);//再次new String(str).length 3
![image.png](https://cdn.nlark.com/yuque/0/2021/png/12831495/1616482988824-9b02e13f-55c8-4888-bdb4-62273b11801d.png#align=left&display=inline&height=173&margin=%5Bobject%20Object%5D&name=image.png&originHeight=173&originWidth=310&size=6101&status=done&style=none&width=310)
- 数组的截断
```javascript
var arr = [1,2,3,4,5];//length 5
arr.length =2;
console.log(arr)//[1,2]
arr.length = 6;
console.log(arr) //[1,2,3,4,5,empty];
题目
第一题
var name = 'languiji';
name += 10;//'languiji10'
var type = typeof (name);//'string'
if (type.length === 6) {//true
// type = new String(type);
type.text = 'string';//new String('string').text ='string' delete new String('string').text;
//或者
}
console.log(type.text)//undefined
第二题
function Test(a, b, c) {
var d = 1;
this.a = a;
this.b = b;
this.c = c;
function f() {
d++;
console.log(d)
}
this.g = f;
//return this; 隐式返回this;形成了闭包。
}
var t1 = new Test(1, 2, 3);
t1.g();//2
t1.g();//3
var test = new Test();
test.g();//2
第三题
/*
go{
x:undefined,1,
y:undefined,0,4,
z:undefined,0,4
add:function(n){
return n=n+3;
}
}
*/
// 阿里面试题。
var x = 1,
y = z = 0;
function add(n) {
return n=n+1;
}
y = add(x);
function add(n) {
return n=n+3
}
z = add(x);
console.log(x, y, z);
第四题
下列那几个能输出1,2,3,4,5
function foo(x) {
console.log(arguments);
return x;
}
foo(1, 2, 3, 4, 5);
function foo(x) {
console.log(arguments);
return x;
} (1, 2, 3, 4, 5)
//(1,2,3,4,5)被理解成了表达式 返回了最后的5
(function foo(x) {
console.log(arguments);
})(1, 2, 3, 4, 5)
第五题
//原题
function b(x,y,a) {
a = 10;
console.log(arguments[2]);//10
}
b(1, 2, 3);
//变形式
function b(x,y,a) {
arguments[2] = 10;
console.log(a);//10
}
b(1, 2, 3);
//自己写的
function b(x,y,a) {
a = 10;
console.log(arguments[2]);//undefined、因为实参没有传值,所以a=10;不能赋值
}
b(1, 2);
作业_
//ASCII 码 表一0-127 表二 128-255
/**
* UNICODE码 0-255占一个字节、涵盖ASCII码,256以后 占2个字节.
*/
// 写一个函数 接收任意一个字符串。算出这个字符串的总字节数。
function getBytes(str) {
var len = str.length;
console.log(str.length);
var bytes = 0;
for (var i = 0; i < len; i++) {
var item = str[i];//字符串当前值。
if (item.charCodeAt(0) > 255) {
bytes += 2;
} else {
bytes += 1;
}
}
return bytes;
}
//优化
function getBytes(str){
var bytes = str.length;
for(var i = 0;i<str.length;i++){
if(str.charCodeAt(i)>255){
bytes++;
}
}
return bytes;
}