包装类与面试题

包装类

系统内置三种: new Number()、new String()、new Boolean()

// 原始值没有自己的属性和方法
var a = 1; // 原始值
console.log(a); // 1

// 经过包装类Number生成一个对象
var b = new Number(a);
b.len = 1;
b.add = function() {
    console.log(1);
}
console.log(b); // Number {1, len: 1, add: ƒ}

var d = b + 1;
// 经过运算又返回原始值
console.log(d); // 2


// 示例1
console.log(new Number(undefined)); // Number {NaN}
console.log(new Number(null)); // Number {0}
console.log(new String(undefined)); // String {"undefined"}
console.log(new String(null)); // String {"null"}

// undefined、null不能设置任何属性和方法
console.log(undefined.length) // 报错
console.log(null.length) // 报错

// 示例2
var a = 123; // 原始值 -> 数字
a.len = 3;
// 过程:
// 1、使用包装类转成对象:new Number(123).len = 3;    
// 2、系统无法保存,delete属性
console.log(a.len); // undefined

// 示例3:使用包装类
var a = new Number(123);
a.len = 3;
console.log(a.len); // 3

// 示例4
var str = 'abc';
// new String(str).length // 因为包装类中有length属性
console.log(str.length); // 3

str.length = 1; // 1、new String(str).length = 1;    2、delete
console.log(str); // abc
// new String(str).length
console.log(str.length); // 3


// // 示例4:数组截断方法
var arr = [1, 2, 3, 4, 5];
console.log(arr.length); // 5
arr.length = 2;
console.log(arr); // [1, 2]
arr.length = 3;
console.log(arr); // [1, 2, empty]

面试题

var name = 'languiji';
name += 10; // 'languiji10'

var type = typeof(name); //'string'

if (type.length === 6) { // true
    type.text = 'string'; 
    // 过程
    // new String(type).text = 'string'
    // delete new String(type).text
}
console.log(type.text); // 'undefined'

// 如果要输出'string',需要使用包装类
// var type = new String(typeof(name)); // 转化为对象,其余不变动
function Car(brand, color) {
    this.brand = 'Benz';
    this.color = 'red';
}

var car = new Car('Mazda', 'blank');
console.log(car); // Car {brand: "Benz", color: "red"}
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; -> 闭包
}
var test1 = new Test();
test1.g(); // 2
test1.g(); // 3

var test2 = new Test();
test2.g(); // 2
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 4 4

GO = {
    x: 1,
    y: 0 > 4,
    z: 0 > 4,
    add: function add(n) {return n = n + 1} >
         function add(n) {return n = n + 3}
}
// 以下哪个可以输出1 2 3 4 5:foo1 和 foo3
function foo1(x) {
    console.log(arguments);
    return x;
}
foo1(1, 2, 3, 4,5);

function foo2(x) {
    console.log(arguments);
    return x;
}(1, 2, 3, 4,5); // 不执行

(function foo3(x){
    console.log(arguments);
    return x;
})(1, 2, 3, 4, 5);
function b(x, y, a) {
    // 形参与arguments映射关系,一一对应
    // a = 10;
    // console.log(arguments[2]); // 10

    arguments[2] = 10;
    console.log(a); // 10
}
b(1, 2, 3);