`
Neil_yang
  • 浏览: 130047 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

JS字符串比较的一个有趣的讨论

阅读更多

哈哈,在MSN中对JS字符串比较的一个有趣的讨论~

 

哈哈,在MSN中对JS字符串比较的一个有趣的讨论~

JSW 发送 2008-4-28 14:58:
在不,有个javascript的问题不明白,可以问你不?
var str1=new String("");
var str2=new String("");
alert(str1==str2);
这两个结果为什么不一样呢

JSW 发送 2008-4-28 14:58:
我总觉得该是一样的

Aimingoo 说:
好象我在书里是讲过这个的吧。

JSW 说:
嗯,有的,但是没怎么明白==,和===的区别,我的理解,上面这样应该true的,但是还是false

Aimingoo 说:
是在P45页(就是《JavaScript语言精髓与编程实践》啦)。

Aimingoo 说:
我的意思是说,引用类型作比较的时候,并不会逐字符的进行check,而是检查它们的引用地址。也就是说,只要不是“同一个对象”的不同引用,就不会等值,也不会全等。

Aimingoo 说:
显然,你的代码中用new String()两次,生成了两个引用。所以……

JSW 说:
有没有一个==和===执行出来结果不一样的情况呢?我发觉好像都是一致的

Aimingoo 说:
你把其用任意一个转换成值类型就可以了。

Aimingoo 说:
例如:
alert(str1.valueOf() == str2);

Aimingoo 说:
或者:
alert(str1+'' == str2)

JSW 说:
呵呵,明白了,谢谢哈
不好意思打扰您工作了

Aimingoo 说:
我把这个贴到51js里去吧。挺有趣的一个问题。
=======================================================================
alert(null==undefined)
alert(null===undefined)
=======================================================================
同理
<script type="text/javascript">
var arr1=[1,2,3,4];
var arr2=[1,2,3,4];
alert(arr1==arr2);
alert(arr1.toString()==arr2);
</script>
=======================================================================
哈哈,楼上的意思是说如何比较两个数组是否相等。当然,这是个好点子。不过更完整的做法是这样:
(), var arr1=[2,1,4,3];
var arr2=[1,3,2,4];
alert( arr1.length==arr2.length && (arr1.sortarr2.sort(), arr1.toString() == arr2) );
=======================================================================
字串是按内容,对象按地址吧
=======================================================================
这个问题以前我跟你讨论过的呀 也是在MSN里面 还争论了string是否是引用类型的

这个是标准的描述

The Strict Equality Comparison Algorithm
The comparison x === y, where x and y are values, produces true or false. Such a comparison is
performed as follows:
1. If Type(x) is different from Type(y), return false.
2. If Type(x) is Undefined, return true.
3. If Type(x) is Null, return true.
4. If Type(x) is not Number, go to step 11.
5. If x is NaN, return false.
6. If y is NaN, return false.
7. If x is the same number value as y, return true.
8. If x is +0 and y is −0, return true.
9. If x is −0 and y is +0, return true.
10. Return false.
11.If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same
length and same characters in corresponding positions); otherwise, return false.
12. If Type(x) is Boolean, return true if x and y are both true or both false; otherwise, return false.
13.Return true if x and y refer to the same object or if they refer to objects joined to each other (see
13.1.2). Otherwise, return false.

The Abstract Equality Comparison Algorithm
The comparison x == y, where x and y are values, produces true or false. Such a comparison is
performed as follows:
1. If Type(x) is different from Type(y), go to step 14.
2. If Type(x) is Undefined, return true.
3. If Type(x) is Null, return true.
4. If Type(x) is not Number, go to step 11.
5. If x is NaN, return false.
6. If y is NaN, return false.
7. If x is the same number value as y, return true.
8. If x is +0 and y is −0, return true.
9. If x is −0 and y is +0, return true.
10. Return false.
11.If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same
length and same characters in corresponding positions). Otherwise, return false.
12. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
13.Return true if x and y refer to the same object or if they refer to objects joined to each other (see
13.1.2). Otherwise, return false.
14. If x is null and y is undefined, return true.
15. If x is undefined and y is null, return true.
16.If Type(x) is Number and Type(y) is String,
return the result of the comparison x == ToNumber(y).
17.If Type(x) is String and Type(y) is Number,
return the result of the comparison ToNumber(x) == y.
18. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
20.If Type(x) is either String or Number and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).
21.If Type(x) is Object and Type(y) is either String or Number,
return the result of the comparison ToPrimitive(x) == y.
22. Return false.
=======================================================================

QUOTE:
原帖由 [i]Aiming[/i] 于 2008-4-29 10:22 发表
哈哈,楼上的意思是说如何比较两个数组是否相等。当然,这是个好点子。不过更完整的做法是这样:


var arr1=[2,1,4,3];
var arr2=[1,3,2,4];
alert( arr1.length==arr2.length && (arr1.sort(), arr2.sor ...

这个如果想把对象也当作纯数据类型的话 还可以比较toJSON (当然还需要实现一下了)

Aiming的这个应该是把数组看作集合了 如果把数组看作序列的话 还是应该用前面的比较方式吧
========================================================================
嗯,赞同winter的看法
应该使用toJsonString转化一下再比较才能通用,否则如果Array里面含有对象,就不对了。
<script>
var arr1=[2,1,{z:2},3];
var arr2=[2,3,1,{z:1}];
alert( arr1.length==arr2.length && (arr1.sort(), arr2.sort(), arr1.toString() == arr2) );
</script>
分享到:
评论

相关推荐

    JS 字符串连接[性能比较]

    首先,JavaScript中的字符串是不可变的,这意味着每次对字符串进行修改(如连接操作)时,都会创建一个新的字符串对象。例如,当使用`+`运算符连接两个字符串时,如`var str = "Hello "; str += "world";`,实际上会...

    js fromCharCode输出26个字母的代码.docx

    在JavaScript中,`fromCharCode()` 是一个非常有用的字符串方法,它允许我们通过Unicode数值来创建字符串。这个方法接收一个或多个数字作为参数,每个数字对应一个Unicode字符,并将这些数字转换为对应的字符。在...

    有趣js代碼

    变量声明使用`var`、`let`或`const`,数据类型包括基本类型(如字符串、数字、布尔值)和引用类型(如对象、数组、函数)。JavaScript的异步处理机制,如回调函数、Promise和async/await,是理解和编写高效代码的...

    js-printer, 一个用于实现打字机效果的javascript小工具.zip

    JavaScript 打印机效果库——js-printer是一个开源的小型工具,专为在网页中模拟打字机效果而设计。这个库允许开发者轻松地在网页上实现文本逐字符滚动的效果,给用户带来一种复古而又有趣的交互体验。下面将详细...

    一些有趣的Javascript库框架集合按名称首字母az归类

    另一个例子是Lodash,它提供了实用的工具函数,帮助开发者处理数组、对象和字符串等数据类型。 接下来,我们讨论JavaScript框架。框架是一种更为全面的解决方案,它定义了一种特定的应用程序结构,并提供了一套规则...

    星星评分js,分数提交到地址栏进行保存

    在这个特定的场景中,我们讨论的是一个JavaScript实现的星星评分功能,其中还包括了将用户选定的分数提交到浏览器的地址栏进行保存的机制。 首先,我们要理解JavaScript在其中扮演的角色。JavaScript是一种运行在...

    javascript读书笔记1

    浮点数的表示要求至少包含一个小数点和一位小数,且在内存中以字符串形式存储直到实际计算时转换。 通过这些基础知识,我们可以更好地理解JavaScript如何处理变量和数据类型,从而编写更健壮和高效的代码。在学习...

    duxinshu.rar_javascript

    1. **初始化**:游戏开始时,JavaScript可能会生成一个秘密数字或字符串,作为“读心”的目标。这个过程可能使用`Math.random()`函数来生成随机值。 2. **用户输入**:用户尝试猜测这个秘密值,JavaScript通过监听...

    JavaScript编程精解 (第一版 带书签) 中文PDF扫描版

    JavaScript有五种基本的数据类型:字符串、数字、布尔、null 和 undefined,以及一种特殊类型——对象。这些基本数据类型加上ES5新增的特性,比如JSON对象的操作,构成了JavaScript的核心语法。 本书还可能涵盖了...

    JavaScript王者归来part.1 总数2

     9.2.4 字符串的模式匹配--一个字符串格式校验的例子   9.2.5 其他方法   9.3 字符串与字符数组   9.4 字符串与文本处理--JavaScript棋谱阅读器(一)   9.4.1 需求分析--什么是棋谱和棋谱阅读器   9.4.2...

    JavaScript中的16进制字符(改进)

    改进之处在于增加了类型检查,确保输入是一个字符串。此外,还保留了原有的 `%` 到 `\` 的转换逻辑,以便于后续处理。 #### 四、逆向转换方法分析 接下来,我们来看看如何将16进制表示的文本转换回原来的字符串。...

    将jquery.qqFace.js表情转换成微信的字符码

    本文介绍了如何将jquery.qqFace.js表情库中的表情图片转换成微信支持的字符码形式,并讨论了jquery.qqFace.js表情库的基本使用方法。 首先,让我们了解jquery.qqFace.js表情库的使用。jquery.qqFace.js是一个用于在...

    Javascript五日教程

    1. **基础语法**:学习变量、数据类型(如字符串、数字、布尔值、数组、对象)、操作符(算术、比较、逻辑)、流程控制(条件语句、循环)等基础概念。 2. **函数**:理解函数的定义、调用,以及参数和返回值的概念...

    javascript-palindrome-number

    在编程领域,回文数字是一个有趣的数学概念,它在JavaScript中也有广泛的应用。回文数是指无论从左向右还是从...通过深入研究该项目,你可以学习到更多关于JavaScript字符串操作和算法设计的知识,提升自己的编程技能。

    JavaScript 视频教程

    13. **jQuery库**:虽然现代JavaScript原生API已经足够强大,但jQuery作为一个经典的库,它的选择器、事件处理和动画效果等功能依然值得学习。 通过本“JavaScript 视频教程”,学习者不仅可以掌握JavaScript的基本...

    Head First Javascript Programming(英文版).pdf

    这包括变量、数据类型(如字符串、数字和布尔值)、操作符(如算术、比较和逻辑操作符)以及流程控制(如条件语句if/else和循环结构for/while)。作者通过实际示例让读者能够直观地看到代码执行的过程,从而更好地...

    javascript 有趣而诡异的数组

    这意味着在JavaScript中,尽管可以使用非数字键(如字符串)来存储数据,但这并不意味着这些键会被视为数组的元素。 在给定的描述中,有一个例子展示了这种特性: ```javascript var associative_array = new ...

    JavaScript精彩实例教程

    在“JavaScript精彩实例教程”中,我们将深入探讨这种强大的编程工具,通过一系列生动有趣的实例,帮助你从零基础到熟练掌握JavaScript。 首先,JavaScript的基本语法是学习的起点,包括变量声明、数据类型(如字符...

    JavaScript

    1. **基础语法**:书中首先会介绍变量、数据类型(如字符串、数字、布尔值、null和undefined)、操作符、流程控制(条件语句、循环)以及函数的基本用法,这些都是JavaScript编程的基础。 2. **对象与数组**:...

    javascript高级教程

    JavaScript语法基于ECMAScript规范,包括变量、数据类型(如字符串、数字、布尔值、null和undefined)、操作符(算术、比较和逻辑)、流程控制(条件语句、循环)以及函数。这些都是构建任何JavaScript程序的基础。 ...

Global site tag (gtag.js) - Google Analytics