1. 程式人生 > >js-基本資料型別-你不知道的趣味題

js-基本資料型別-你不知道的趣味題

趣味1:原生js實現字串轉為陣列,反轉陣列

/*寫個js函式func(str),傳參str為一個字串,實現把這個字串語句中的單詞(空格隔開的)次序逆序。
比如把 I am a coder變成 coder a am I,不允許使用reverse,join,substr,split*/
    var str = "I am a coder";
    console.log(getStr(str));

    /*字串語句中的單詞(空格隔開的)次序逆序*/
    function getStr(str) {
        var res = "",
            temp = ""
; for (var i = str.length - 1; i >= 0; i--) { if (str[i] == " " || i == 0) { temp += (i == 0 ? str[i] : ""); res += (i == 0 ? reverseStr(temp) : reverseStr(temp) + " "); //處理末尾沒有空格 temp = ""; continue; } temp += str[i]; } return
res; } /*反轉字串*/ function reverseStr(str) { var newStr = ""; for (var i = str.length - 1; i >= 0; i--) { newStr += str[i]; } return newStr; }

趣味2:物件新增屬性,屬性是物件,該咋辦?

var c={};
var a={a:"a"};
var b={b:"b"};
c[a]=123;
c[b]=345;
console.log(c[a]);

c是物件,新增屬性時,都會轉為字串。
這裡新增a屬性,a是物件,呼叫toString()方法,轉化為字串“[object,Object]”,所以c就把“[object,Object]”當做屬性加進去了,值為123。c[b]同樣的道理,但345會覆蓋123,所以結果為345

趣味3.如果 對於function的引數arguments 想當做陣列來使用陣列的內建函式 要怎麼做?

Array.prototype.***.call
function test(name,age){
    console.log(Array.prototype.join.call(arguments,",")); //xiaowei,18

    var arr = ["1","2"];
    console.log(arr.concat("3").join(",")); //1,2,3     
    console.log(Array.prototype.concat.call(arguments,"come").join(",")); //[object Arguments],come
    console.log([].slice.call(arguments).concat("come").join(',')); //xiaowei,18,come
    console.log(Array.prototype.concat.apply(["come"],arguments)); //come,xiaowei,18
}
    test("xiaowei",18);
    var name = "lala";

備註:arguments轉為陣列的方法:[].slice.call(arguments);
或者 Array.prototype.slice.call(arguments);
 function fn(a, b, c) {
            /*方法一:var arr = [].slice.call(arguments);*/
            /*方法二:var arr = [].concat.apply([],arguments);*/
            /*方法三*/
            var arr = [];
            arr.push.apply(arr,arguments);
            console.log(arr instanceof Array);
            console.log(arr);
        }
        fn(1,2,3);

趣味4: js 裡面陣列下標可以是負值問題

var arr = [];
arr[0] = 0;
arr[1] = 1;
arr[-1] = -1;
arr[1.1] = 1.1;
arr['a'] = 'a';
console.log("length: " + arr.length);
console.log(arr);
for(var i in arr){
    console.log(i + " :" + arr[i]);
}

這裡寫圖片描述

陣列物件其實是一個特殊物件,他擁有普通物件的全部特性,所以不止負索引,小數索引,連字串索引都是可以的,只是用這些索引向陣列新增屬性時,陣列的length不會增加罷了,而只有當索引是正整數或其對應數字串時,length才會增加,僅此而已。

例題:

var arr = [];  
arr['a'] = 1;  
console.log(arr.length); // A  
arr['2'] = 2;  
console.log(arr.length); // B  
arr.length = 0;  
console.log(arr); // C  
結果為: 0 3 [a:1]

趣味5: js 裡面陣列設定length為10000,會不會開闢記憶體?

陣列是特殊的物件,可以理解為屬性值是數值的物件,當我們直接將一個空陣列的length設為10000,並不會多開闢記憶體空間。

var a=[2,3,4];
a.length=10000;
console.log(a.length); //10000
console.log(a[900]); //undefined,並沒有開闢更多的記憶體空間,js中是用到才開闢

6、函式表示式–匿名函式

var f = function g() {
    return 23;
};
typeof g(); //輸出什麼

// ReferenceError: g is not defined

7、Array.prototype.indexOf() ,switch…case 使用全等模式比較

function showCase(value) {
    switch (value) {
    case 'A':
        console.log(1);
        break;
    case 'string':
        console.log(2);
        break;
    case undefined:
        console.log(3);
        break;
    case 'undefined':
        console.log(4);
        break; 
    default:
        console.log(5);
        break;              
    }
}
showCase(new String('A'));

//結果:5