构造函数和实例化原理

  1. function Car(color,brand) {
  2. // var this = {
  3. // 隐式定义了this;
  4. // }
  5. this.color = color;
  6. this.brand = brand;
  7. //return this;隐式返回了this
  8. }
  9. var car = new Car('red','BMW');
  10. console.log(car.color);
  11. GO = {
  12. car:undefined,
  13. Car :function(){....}
  14. }
  15. AO = {
  16. this:{
  17. color:color,
  18. brand:brand
  19. }
  20. //实例化的时候产生了this;
  21. }
  • new 改变了this指向,将this 指向改为指向实例化对象。

    模拟构造函数

    1. function Car(color,brand){
    2. var me = {};//类似 this;
    3. me.color = color;
    4. me.brand = brand;
    5. return me;//这里显示返回me 构造函数是隐式返回this;
    6. }

构造函数中的return引用值类型就会覆盖原来的this,return 原始值类型则不会覆盖

  1. function Test(opt){
  2. this.name =opt.name;
  3. return undefined;//无效
  4. return null;//无效
  5. return 1,//无效
  6. return false,//无效
  7. return '1'//无效
  8. }
  9. var t = new Test({name:1})
  10. console.log(t.name)//1
  11. function Test(opt){
  12. this.name =opt.name;
  13. return {};//有效
  14. return [];//有效
  15. return /{abc}/g//有效
  16. return new Date();//有效
  17. }
  18. var t = new Test({name:1})
  19. console.log(t.name)//undefined

JS包装类

  • 原始值没有自己的属性和方法
  • new Number() new String() new Boolean();

    1. var a = 1;
    2. var b = new Number(a);
    3. b.len = 3;
    4. b.add = function(){
    5. console.log(1);
    6. }
    7. console.log(b);//{len:3,add:function(){...}}

    image.png
    例子2

    1. var a = 123;
    2. a.len = 3;
    3. console.log(a.len)//undefined
    4. /**系统操作
    5. * //new Number(123).len = 3; delete a.len;
    6. * 类似于
    7. * var obj={};
    8. * obj.name=3;
    9. * delete obj.name;
    10. * console.log(obj.name);
    11. */
  • 一个数字经过new Number()之后就变成数字对象。数字对象参与运算之后又回归的原始值。

  • undefined,null 不能有属性和方法 undefined.len=3;null.len=3???//报错、
  • 字符串包装类有length 属性。原型值是没有方法和属性的

    1. undefined.length//报错。
    2. null.length//报错
    3. 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

  1. ![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)
  2. - 数组的截断
  3. ```javascript
  4. var arr = [1,2,3,4,5];//length 5
  5. arr.length =2;
  6. console.log(arr)//[1,2]
  7. arr.length = 6;
  8. console.log(arr) //[1,2,3,4,5,empty];

题目

第一题

  1. var name = 'languiji';
  2. name += 10;//'languiji10'
  3. var type = typeof (name);//'string'
  4. if (type.length === 6) {//true
  5. // type = new String(type);
  6. type.text = 'string';//new String('string').text ='string' delete new String('string').text;
  7. //或者
  8. }
  9. console.log(type.text)//undefined

第二题

  1. function Test(a, b, c) {
  2. var d = 1;
  3. this.a = a;
  4. this.b = b;
  5. this.c = c;
  6. function f() {
  7. d++;
  8. console.log(d)
  9. }
  10. this.g = f;
  11. //return this; 隐式返回this;形成了闭包。
  12. }
  13. var t1 = new Test(1, 2, 3);
  14. t1.g();//2
  15. t1.g();//3
  16. var test = new Test();
  17. test.g();//2

第三题

  1. /*
  2. go{
  3. x:undefined,1,
  4. y:undefined,0,4,
  5. z:undefined,0,4
  6. add:function(n){
  7. return n=n+3;
  8. }
  9. }
  10. */
  11. // 阿里面试题。
  12. var x = 1,
  13. y = z = 0;
  14. function add(n) {
  15. return n=n+1;
  16. }
  17. y = add(x);
  18. function add(n) {
  19. return n=n+3
  20. }
  21. z = add(x);
  22. console.log(x, y, z);

第四题

下列那几个能输出1,2,3,4,5

  1. function foo(x) {
  2. console.log(arguments);
  3. return x;
  4. }
  5. foo(1, 2, 3, 4, 5);
  6. function foo(x) {
  7. console.log(arguments);
  8. return x;
  9. } (1, 2, 3, 4, 5)
  10. //(1,2,3,4,5)被理解成了表达式 返回了最后的5
  11. (function foo(x) {
  12. console.log(arguments);
  13. })(1, 2, 3, 4, 5)

第五题

  1. //原题
  2. function b(x,y,a) {
  3. a = 10;
  4. console.log(arguments[2]);//10
  5. }
  6. b(1, 2, 3);
  7. //变形式
  8. function b(x,y,a) {
  9. arguments[2] = 10;
  10. console.log(a);//10
  11. }
  12. b(1, 2, 3);
  13. //自己写的
  14. function b(x,y,a) {
  15. a = 10;
  16. console.log(arguments[2]);//undefined、因为实参没有传值,所以a=10;不能赋值
  17. }
  18. b(1, 2);

作业_

  1. //ASCII 码 表一0-127 表二 128-255
  2. /**
  3. * UNICODE码 0-255占一个字节、涵盖ASCII码,256以后 占2个字节.
  4. */
  5. // 写一个函数 接收任意一个字符串。算出这个字符串的总字节数。
  6. function getBytes(str) {
  7. var len = str.length;
  8. console.log(str.length);
  9. var bytes = 0;
  10. for (var i = 0; i < len; i++) {
  11. var item = str[i];//字符串当前值。
  12. if (item.charCodeAt(0) > 255) {
  13. bytes += 2;
  14. } else {
  15. bytes += 1;
  16. }
  17. }
  18. return bytes;
  19. }
  20. //优化
  21. function getBytes(str){
  22. var bytes = str.length;
  23. for(var i = 0;i<str.length;i++){
  24. if(str.charCodeAt(i)>255){
  25. bytes++;
  26. }
  27. }
  28. return bytes;
  29. }