관리 메뉴

I LOVE EJ

javascript 형변환 본문

Web publishing/JavaScript

javascript 형변환

BeOne 2008. 8. 19. 17:15

Wrox Professional JavaScript for Web Developer
( 자세한 내용은 책에... 좋은 책이다. GOOD!!! )

JavaScript is
  1. The Core( ECMAScript )
  2. The Document Object Model ( DOM )
  3. The Browser Object Model( BOM )

현재의 모든 웹 브라우저는 ECMA-262 의 third edition을 따른다.

ECMAScript 의 기본 컨셉은 다음과 같다.
- Everything is case-sensitive.
- variabled are loosely typed.
- End-of-line semicolons are optional
( ";"이 없으면 라인의 끝을 문장의 끝으로 인식한다.
  하지만 오동작을 하는 브라우저가 있으므로 넣어준다. )
- Comments are the same as in Java, C and Perl.
- Braces indicate code blocks.


변수는 "var"를 사용해서 정의한다.

var test = "hi";
var test = "hi", test2 = "hola";

서로 다른 타입을 동시에 정의할 수 있다.
var test = "hi", age = 25;

자바처럼 초기화를 하지 않는다고 해서 문제가 생기지 않는다.

굳이 변수를 사용하기 전에 선언을 할 필요가 없지만 해주는 것이 좋다.

var sTest = "hello";
sTest2 = sTest + "world";

sTest2 는 자동으로 global 변수가 된다.


ECMA-262 Keyword
break                 else                new                 var
case                  finally              return               void
catch                 for                   switch             while
continue             function           this                  with
default               if                     throw
delete                in                   try
do                     instanceof       typeof

ECMA-262 Edition 3 Reserved Words
( 현재는 사용해도 문제가 생기지 않지만 미래에 문제가 생길 수 있다. )
abstract                 enum            int                  short
boolean                 export           interface         static
byte                       extends        long               super
char                     final               native             synchronized
class                   float               package          throws
const                   goto               private            transient
debugger             implements      protected        volatile
double                 import             public


EMCAScript 변수의 두가지 타입

primitive type : stack에 저장되는 데이터
--> undefined, null, boolean, number, string
reference : heap에 저장되는 데이터

primitive type를 체크할 수 있는 "typeof"

var sTemp = "test string";
alert( typeof sTemp );
alert( typeof 95 );

typeof의 값은 다음 값중 하나
- undefined
- boolean
- number
- string
- object : 변수가 reference 타입이거나 null 타입인 경우
( 테스트 해보니 null인 경우 "null"로 리턴 )

undefined type
1. 선언만하고 초기화하지 않는 겨우
var oTemp;
alert( oTemp );
2. function의 리턴값이 명확하지 않을 때
funtion testFunc() {
}

alert( testFunc() == undefined );

Null type
- undefined 는 사실 null 로 부터 파생된 것이다.
alert( null == undefined ) ; // true

Number type
- 32비트 integer이거나 64비트 floating-point
예상했다시피
var iNum = 55;       //
var iNum = 070;      // 8진수
var iNum = 0x1f;     // 16진수

Number.MAX_VALUE
Number.MIN_VALUE

연산의 결과가 Number.MAX_VALUE보다 큰 경우 Number.POSITIVE_INFINITY를 할당함.
연산의 결과가 Number.MIN_VALUE보다 큰 경우 Number.NEGATIVE_INFINITY를 할당함.

--> isFinite()라는 함수가 있음.

NoN : Not a Number

숫자가 아닌 타입을 숫자 타입으로 변환하려는 경우
희한하게 alert( NaN == NaN ); //false

alert( isNaN( "blue" ) ); // true
alert( isNaN( "123" ) ); // false

데이터 타입간의 컨버젼

boolean, number --> string
var bool = false;
var num - 1;
alert( bool.toString() );
alert( num.toString() );

숫자인 경우 진수변환 메소드를 가지고 있음.
alert( num.toString( 2 ) );
alert( num.toString( 8 ) );
alert( num.toString( 16 ) );

string --> number
parseInt() 함수를 사용함.

var iNum1 = parseInt( "1234blue" ); //1234 --> 유효한 값 까지만 체크하여 변환함.
var iNum2 = parseInt( "0xA" ); //10
var iNum3 = parseInt( "22.5" ); //22
var iNum4 = parseInt( "blue" ); // NaN

진수를 지정하여 변환하는 것도 가능함.
var iNum1 = parseInt( "AF", 16 ); // 175
var iNum2 = parseInt( "10", 2 ); // 2
var iNum3 = parseInt( "10", 8 ); // 8
var iNum4 = parseInt( "10", 10 ); // 10

parseFloat() 함수를 사용함.

var fNum1 = parseFloat( "1234blue" ); // 1234.0
var fNum2 = parseFloat( "0xA" ); // NaN
var fNum2 = parseFloat( "22.5" ); 22.5
var fNum3 = parseFloat( "22.34.5" ); // 22.34
var fNum6 = parseFloat( "0906" ); // 906
var fNum7 = parseFloat( "blue" ); // NaN

Boolean();
Number();
String();
을 사용해서도 type casting이 가능하다.

Object class
기본 클래스라 할 수 있겠다.

# properties
- constructor : 객체가 생성될 때 호출될 function의 reference
- prototype : 객체의 prototype에 대한 reference

# methods
- hasOwnProperty( property ) : 인자로 주어진 property가 존재하는지 체크 : 스트링 형태로 주어져야 함.
- isPrototypeOf( object ) : 다른 객체의 prototype인지 아닌지 (?)
- propertyIsEnumerable( property ) : enumerated 가능한지
- toString() : 객체를 나타내는 string 값
- valueOf()

Nunmber class


var oNumberObject = new Numer(99);
alert( oNumberObject.valueOf() ); // retrun primitive type

alert( oNumberObject.toFiexed(2) ); //outputs 99.00
range : 0 ~ 20

alert( oNumberObject.toExponential() ); // 9.9e+1

String class

var oStringObject = new String( "hello World" );
alert( oStringObject.length ); // 11
alert( oStringObject.charAt(1) ); // e
alert( oStringObject.charCodeAt() ); // 101

var oStringObject = new String( "hello " );
var sResult = oStringObject.concat( "world" );
alert( sResult );  // "hello world"
alert( oStringObject ); // "hello";

sResult = oStringObject + "world";

var oStringObject = new String( "hello world" );
alert( oStringObject.indexOf( "o" ) );    // 4
alert( oStringObject.lastIndexOf( "o" ) );   // 7

var oStringObject = new String( "yellow" );
alert( oStringObject.localeCompare( "brick" ) ); // 1
alert( oStringObject.localeCompare( "yellow" ) ); // 0
alert( oStringObject.localeCompare( "zoo" ) ); // -1

var oStringObject = new String( "hello world" );
alert( oStringObject.slice(3) );  // "lo world"
alert( oStringObject.substring( 3 ) ); // "lo world"
alert( oStringObject.slice( 3, 7 ) ); // "lo w";
alert( oStringObject.substring( 3, 7 ) ); // "lo w";

slice와 substring이 같은 결과를 리턴하는데 두 메소드의 차이점은 음수의 처리이다.

var oStringObject = new String( "hello world" );
alert( oStringObject.slice(-3) );   // "rld"
alert( oStringObject.substring( -3 ) );  // "hello world"
alert( oStringObject.slice( 3, -4 ) );  // "lo w";
alert( oStringObject.substring( 3, -4 ) ); // "hel"

slice는 -3을 length + (-3) 으로 인식하여 처리하고
substring은 -3을 0으로 인식하여 처리한다.


toLocaleUpperCase(), toUpperCase(), toLocaleLowerCase(), toLowerCase()

instanceof

Operator

delete 앞서 정의된 속성이나 메소드를 삭제함.

var o = new Object;
o.name = "Nicholas";
alert( o.name ); // Nicholas
delete o.name;
alert( o.name ); // undefined
- 개발장에 의해 정의된 속성이나 메소드가 아닌 경우에는 사용할 수 없음.

delete o.toString(); --> error


bitwise NOT : ~
bitwise AND : &
bitwise OR  : |
bitwise XOR : ^
left shift : <<
signed right shift : >>
unsigned right shift : >>>
logical NOT : !
logical ANT : &&
logical OR : ||
multipy : *
divide : /
modulus : %
add : +
subtract : -
reation operator : <, >, <=, >=
equal : ==
not equal : !=
identically equal  ===

Label
label : statement

break, 나 continue 문에서 사용

var iNum = 0;

outermost:
for ( var i = 0 ; i < 10, i++ ) {
  for ( var j = 0 ; j < 10 ; j++ ) {
    if ( i == 5 && j == 5 ) {
   continue outermost;
 {
 iNum++;
  }
 }
 
with ( expression ) statement;

var sMessage = "heelo world";
with( sMessage ) {
 alert( toUpperCase() );
}


사용하지 않는게 좋다고 함.


function functionName( arg0, arg1, ..., argN ) {
 statements
}

function이 명확하게 어떤값을 리턴하지 않거나 값이 없이 return; 문만 사용되는 경우에

undefined이 리턴될 것이다.

overloading은 없다. overwriting은 있다.

"arguments"라는 객체를 사용할 수 있다.

function sayHi() {
 alert( arguments.length );
 if ( arguments[0] == "bye" ) {
  return;
 }
 alert( arguments[0] );
}

Function class

var function_name = new Function( argument1, argument2, ..., arugmentN, function_body );

var sayHi = new Function( "sName", "sMessage", "alert( \"Hello\" + sName + \", \" + sMessage + \");" );
느리다 쓰지마라.

function doAdd( iNum ) {
 alert( iNum + 10 );
}

alert( doAdd.toString() );


Closures...(?)