白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
阅读:1662回复:2

[已解决]关于js的constructor,有一点百思不得骑姐

楼主#
更多 发布于:2013-03-21 16:39
同样的代码,通过<script>读取的,和web控制台执行的结果为什么不一样呢,这和js环境有关系吗?

图片:1.png



测试页面:
很抱歉没有界面,你需要用web控制台或者firebug直接执行命令

<!DOCTYPE HTML>
<html lang="en-US">
<head>
	<meta charset="UTF-8">
	<title>constructor bug</title>
</head>
<body>
	<script type="text/javascript">
		function IsArray(val){
			return (val.constructor === Array);
		}
		function IsMyArray(){
			return ([1,2,3].constructor === Array);
		}
	</script>
</body>
</html>
-いたんですか? -ええ、ずっと
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-28
  • 发帖数628
  • 经验574枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
1楼#
发布于:2013-03-21 16:39
Re: 关于js的constructor,有一点百思不得骑姐
实际上是firefox的js引擎问题。数组参数在传递时被用Proxy包装了一下。所以constructor当然就不会是Array了

图片:捕获.PNG



这种包装好象只针对页面上的脚本,web控制台的似乎没有管

Proxy的文档:
https://developer.mozilla.org/zh-CN/doc ... 7.90.86API

要判断数组呢,有条件的话最好用ES5的Array.isArray方法,如果要兼容旧浏览器,也有一个比较通用的方法
function isArray(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
}
白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
2楼#
发布于:2013-03-21 16:39
Re: 关于js的constructor,有一点百思不得骑姐
taoww:实际上是firefox的js引擎问题。数组参数在传递时被用Proxy包装了一下。所以constructor当然就不会是Array了


这种包装好象只针对页面上的脚本,web控制台的似乎没有管

Proxy的文档:
https://developer.mozilla.org/zh-CN/doc ... 7.90.86API

要判断数组呢,有条件的话最好用ES5的Array.isArray方法,如果要兼容旧浏览器,也有一个比较通用的方法
function isArray(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
}
回到原帖


  原来是这样,学习了,非常感谢!
我是用firebug调试的所以看不出端倪呀

图片:1.png



我是给自己写的工具网页,没有兼容旧浏览器和其他浏览器的需求,所以就用isArray就完美啦
-いたんですか? -ええ、ずっと
游客

返回顶部