在页面上我使用类似的语法google analitycs代码,将参数传递给另一个脚本.我遍历数组并尝试根据包含的脚本中的参数构造URL的查询部分.
问题是以下迭代通过javascript数组对象方法也搞乱了结果queryString.
index.html的:
<script>
var params = [];
params['first'] = '1';
params['second'] = '2';
(function() {
var vs = document.createElement('script');
vs.async = true; vs.type = 'text/javascript';
vs.src = 'http://my.domain.com/js/includedScript.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(vs, s);
})();
</script>
Run Code Online (Sandbox Code Playgroud)
includedScript.js:
function(paramsArray) {
tmpArray = [];
for(i in paramsArray) {
tmpArray.push(i + '=' + escape(paramsArray[i]));
}
var queryString = tmpArray.join('&');
}(params);
Run Code Online (Sandbox Code Playgroud)
我得到了(缩短):
queryString == 'first=1&second=2&push&$family=function%20%28%29%20%7B%0A%20%20%20%20return%20lower%3B%0A%7D&$constructor=function%20Array%28%29%20%7B%0A%20%20%20%20%5Bnative%20code%5D%0A%7D&pop=function%20pop%28%29%20%7B%0A%20%20%20%20%5Bnative%20code%5D%0A%7D&push=function%20push%28%29%20%7B%0A%'
Run Code Online (Sandbox Code Playgroud)
我预计:
queryString == 'first=1&second=2'
Run Code Online (Sandbox Code Playgroud)
奇怪的是,在我的localhost空白页面上,它运行良好.index.html页面上的其他一些javascript 会与我的代码冲突吗?如何通过仅更改我的代码(最好只更改includedScript.js文件)来修复冲突?
提前致谢.
一个小小的变化:
var params = {}; // notice the difference here!
params['first'] = '1';
params['second'] = '2';
Run Code Online (Sandbox Code Playgroud)
还有一个在这里
for(i in paramsArray) {
if(paramsArray.hasOwnProperty(i)){
tmpArray.push(i + '=' + escape(paramsArray[i]));
}
}
Run Code Online (Sandbox Code Playgroud)
JavaScript Array只应与数字索引一起使用.对于关联数组,请Object改用.还要确保您获得的属性是由您添加的,并且不属于原型用途hasOwnProperty.
有关详细信息,请参阅有关mozilla.org的文档.
数组是与单个变量名称关联的有序值集.请注意,不应将其用作关联数组,而应使用Object.
你也可以阅读这篇文章:http: //andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/
注意:for ... inJavaScript构造与之无关Array.它的目的是迭代Object属性,而不是Array元素.在JavaScript中,属性还包括方法.
有趣的JavaScript.
尝试以下代码并告诉我您是否感到惊讶:
var x = [];
x['one'] = 1;
x['one'] = 2;
alert(x.length);
Run Code Online (Sandbox Code Playgroud)
然后尝试这个:
Object.prototype.myProp = 123;
var x = {one: 1, two: 2}
for(var prop in x){
alert(x[prop]);
}
Run Code Online (Sandbox Code Playgroud)