js-基本資料型別-你不知道的趣味題
阿新 • • 發佈:2019-02-06
趣味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